1. 怎樣在linux下創建cpp文件打開GNU編譯器之後,命令行要怎麼寫
可以直接創建新文件,改後綴名為cpp後打開編寫
或者在終端輸入vi
file_name.cpp後用vi編寫,關於vi的命令自己查吧!
編譯
g++
-W
-g
file_name.cpp
執行./a.out
2. vs 命令行編譯靜態庫
_declspec(dllexport) void test_print(char* sz_input);
這是動態鏈接庫 -- dllexport ,dll是動態鏈接庫。
不是你說的靜態庫。
動態鏈接庫,應用程序調用它,編譯鏈接時要有.lib, 運行時要有.dll
Debug\ -- 給別的程序用,要用 Release\,不能用 Debug\
char * __ptr64 sz_input;
__ptr64 -- 32位機上,指針sz_input截斷為32位.
char * __ptr32 sz_input;
__ptr32 -- 64位機上,指針sz_input變32位
wchar_t,_MBCS -- 表明你要用雙位元組字元,那麼程序就不應當用 單位元組char 型。如果你要編的不是要用雙位元組字元,那麼 就不要 wchar_t,_MBCS。
3. 如何在命令行中使用intel c++編譯器,並使用openmp和mkl來編譯自己的程序,並運算
1、icc
Intel C/C++編譯器接受遵守ANSI C/C++ , ISO C/C++ standards,GNU inline ASM for IA-32 architecture標準的輸入。與linux下常用的gcc兼容並支持更大的C語言擴展,包括源文件、命令行參數、目標文件。不支持gcc的inline方式的匯編。例,f.c
#include<stdio.h>
int main(int argc, char* argv[]){
printf("Hello\n");
return 0;
}
編譯:icc -c f.cpp -o f.o
鏈接:icc f.o -o f
運行:./f
注意,編譯與鏈接都由icc來完成,icc常用命令行參數:
-o 輸出文件命名
-I include路徑
-L lib路徑
-l 包含的lib名
-c 僅生成目標文件(*.o),不鏈接
-On n=0,1,2,3 編譯器優化選項,n=0關閉編譯器優化,n=3使用最激進的優化
-c99[-] 打開/關閉 c99規范的支持
詳細的請參照icc的manpage.
2、ifort
Intel Fortran編譯器支持F77/90/95標准並與CFV(Compaq Visual Fortran)兼容。例,f.f90
program f
print *, "Hello"
stop
end
編譯:ifort -c f.f90 -o f.o
鏈接:ifort f.o -o f
運行:./f
編譯與連接同樣由ifort來完成,ifort常用命令行參數:
-o 輸出文件命名
-I include路徑
-L lib路徑
-l 包含的lib名
-c 僅生成目標文件(*.o),不鏈接
-On n=0,1,2,3 編譯器優化選項,n=0關閉編譯器優化,n=3使用最激進的優化
-std90 使用F90標准編譯
-std95 使用F 95標准編譯
-f77rtl 編譯使用F77運行方式的代碼(用於解決特殊問題)
These options optimize application performance for a particular Intel? processor or family of processors. The compiler generates code that takes advantage of features of the specified processor.
Option
Description
tpp5 or G5 Optimizes for Intel? Pentium? and Pentium? with MMX? technology processors.
tpp6 or G6 Optimizes for Intel? Pentium? Pro, Pentium? II and Pentium? III processors.
tpp7 or G7 Optimizes for Intel? Pentium? 4, Intel? Xeon?, Intel? Pentium? M processors, and Intel? Pentium? 4 processors with Streaming SIMD Extensions 3 (SSE3) instruction support.
On Intel? EM64T systems, only option tpp7 (Linux) or G7 (Windows) is valid.
About tpp:
http://www.ncsa.illinois.e/UserInfo/Resources/Software/Intel/Compilers/9.0/main_for/mergedProjects/copts_for/common_options/option_tpp567_g567.htm
https://wiki.ke.e/display/SCSC/Compilers+and+Libraries
Intel Fortran Compiler Options: http://geco.mines.e/guide/ifort.html
Intel(R) Fortran Compiler Options: http://www.rcac.pure.e/userinfo/resources/common/compile/compilers/intel/man/ifort.txt
ifort編譯器提供了非常多的優化參數
$ ifort --help | more 查看就可以
也可以定位到某個參數
$ifort --help | grep -5 '-mkl'
-5表示顯示查找到的行及下面5行的內容。
3、Intel MKL數學庫針對Intel系列處理器進行了專門的優化,主要包含的庫有:
基本線形代數運算(BLAS)
向量與向量、向量與矩陣、矩陣與矩陣的運算
稀疏線形代數運算
快速傅立葉變換(單精度/雙精度)
LAPACK(求解線形方程組、最小方差、特徵值、Sylvester方程等)
向量數學庫(VML)
向量統計學庫(VSL)
高級離散傅立葉變換
編譯:
icc multi.c -I/opt/intel/mkl/include –L/intel/mkl/lib –lmpi_ipf –o multi
4、MPI程序編譯
消息傳遞介面(MPI)並行程序設計模型程序的編譯命令。例,f.c
include<stdio.h>
#include<mpi.h>
main(argc,argv)
int argc;
char *argv[];
{
char name[BUFSIZ];
int length;
MPI_Init(&argc,&argv);
MPI_Get_processor_name(name, &length);
printf("%s: hello world\n", name);
MPI_Finalize();
}
編譯與連接均使用mpicc,參數與mpicc中定義的編譯器相同,這里與icc相同。
mpicc –c hello.c –o hello.o
mpicc hello.o –o hello
運行使用mpirun 命令,將運行需要的節點定義在文件中並在-machinfile中制定。
文件: nodelist
node1
node1
node2
node3
運行:
$mpirun –machefile nodelist –np 4 ./hello
node1: hello world
node1: hello world
node2: hello world
node3: hello world
5、32位向64位的移植
32位程序到64位移植中應注意的常見問題:
數據截斷:
由於long類型變數的運算(賦值、比較、移位等)產生。long定義在x86上為32bits,而在ia64上為64bits.容易在與int型變數運算時出現異常。
處理方法:盡量避免不同類型變數間的運算,避免將長度較長的變數賦值到較短的變數中,統一變數長度可以解決這個問題。簡單的對於32位轉移到64位可以將所有long定義轉換為int定義。
4. 如何用命令行編譯cpp文件
單個文件:
g++
file.cpp
這是最簡單形式,預設輸出為a.out,可以用-o命令指定輸出文件,比如g++
file.cpp
f.out
多個文件:
g++
-c
1.cpp
-o
1.o
g++
-c
2.cpp
-o
2.o
g++
1.o
2.o
-o
prog.out
鏈接成可執行文件:
一般用g++
-o
file
file.cpp
多個文件是g++
-o
file
file1.cpp
file2.cpp
編譯C++不是用GCC而是G++.
如果用GCC能編譯但不能鏈接.
多個文件:
1.編譯多個文件,但不連接:
g++
file1.cpp
file2.cpp
會生成兩個文件:file1.o,
file2.o
2.連接:
g++
-o
outFileName
file1.o
file2.o
會生成一個可執行文件:outFileName。
5. eclipse編譯cpp文件,並且引用其他預編譯的庫
jni相關的單獨放在一個文件夾內,包括
注意點有:
1.前面兩個庫的引用基本是固定寫法,結尾寫成
include $(PREBUILT_SHARED_LIBRARY)
2.第三個庫為main.cpp,是我們要編譯的庫,它引用其他.so庫的時候,用
3.新建項目默認是沒有ndk環境的,需要右鍵項目AndroidTools里啟用NDK環境,如果沒有這一步,項目是沒有obj文件夾的,之後ndk-build也不會正常編譯
這就是一個普通的.cpp文件,所以很多寫法要遵守cpp的格式來寫,比如頭文件的引入,方法的重復定義報的錯,都需要一修改
這一步比較簡單,命令行進入jni文件夾下,運行ndk-build即可,期間可能會遇到各種問題,網路解決即可,此時的主要問題一般是cpp文件編譯的問題
1.遇到一個編譯waning問題
在Application.mk中加入這個即可
忽略warning,防止編譯不通過
APP_CFLAGS += -Wno-error=format-security
6. 如何在windows的命令行環境下編譯C++程序
你使用VS2008的話,安裝完成後選擇 Visual Studio 2008 Command Prompt,出現一個cmd窗口,x0dx0a使用x0dx0acl main.cpp x0dx0a就可以編譯!x0dx0a如果你的項目比較復雜,就自己寫一個Makefile文件吧!
7. 如何在windows的命令行環境下編譯C++程序
第一步:安裝編譯環境
下載並安裝Visual Studio,本人安裝的Visual Studio 2012
第二步:設置環境變數
1)右鍵「計算機(我的電腦)」,選擇「屬性->高級系統設置->環境變數」,找到「系統變數」中的「PATH"屬性,雙擊之
2)復制Visual Studio安裝目錄下的路徑「D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin」到環境變數中(PATH中已經有其它變數,則粘貼到最後面,並且用英文「;」與前面的變數隔開)
第三步:修改命令行啟動參數
1)在「開始->運行」中輸入「cmd」,開始菜單中將列出"cmd.exe",右鍵它,然後「發送到->發送到桌面快捷方式」
2)右鍵步驟1)中創建的桌面快捷方式,選擇「屬性->快捷方式」,找到「目標(T)」欄,修改目標為「C:\Windows\System32\cmd.exe /k vcvars32.bat」,修改好後點確定
第四步:編寫test.cpp程序
1)在D盤新建一個文件夾,命名為testCode
2)打開testCode,在裡面新建一個文本文檔,命名為test.cpp(注意,如果你的系統設置中隱藏了已知文件類型的擴展名,必須顯示它,否則你創建的test.cpp的真實名字將是test.cpp.txt)
3)用記事本或EditPlus打開test.cpp,在其中寫入代碼,例如:
#include <iostream>
int main()
{
std::cout<<"Hello World!"<<std::endl;
while(1)
{
//ignore
}
}
第五步:編譯test.cpp
1)雙擊第三步中創建的cmd.exe的桌面快捷方式,打開命令行窗口
2)輸入:cd d: 回車
3)輸入:cd Ccodes 回車
4)輸入:cl -EHsc test.cpp 回車
編譯器開始編譯test.cpp。我們可以從命令行的輸出內容中看到編譯結果。如果程序沒有書寫錯誤,一定可以編譯出一個test.exe和一個test.obj。其中exe文件即是編譯後的可執行程序。obj文件是按塊編譯產生的中間文件。至此,整個命令行編譯流程結束。
8. c和.cpp的文件怎麼一起編譯
可以在命令行下編譯多個C/CPP文件,通過cl -c命令來編譯類文件,編譯成obj文件後,你可以使用lib命令將其編譯為lib文件,然後使用link命令連接多個obj文件。
默認生成的可執行文件的名稱是命令中第一個obj文件的名稱,具體參考代碼如下:
#include<iostream>
class A{
public:
int a;
int b;
void say();
};
------
/**
class A{
public:
int a;
int b;
void say();
};
*/
#include "A.h"
void A::say(){
a = b;
}
------
//#include<iostream>
#include "A.h"
using namespace std;
int main(){
A a;
a.a = 0;
a.b = 9;
a.say();
cout<<a.a<<" "<<a.b<<endl;
}
9. C++如何用命令行編譯多個.cpp文件
cl a.cpp b.cpp c.cpp。。。。。直接把.cpp文件用空格隔開就行了