1. 程式人生 > >CMake error 合集(Configuring incomplete errors occurred!)

CMake error 合集(Configuring incomplete errors occurred!)

其實,每次碰到要安裝一些軟體啊,通常軟體的原始碼都是c/c++,剛開始LZ不理解,從來都是跟著Readme.txt,一步步安裝,如果說一帆風順的把軟體安裝好了,也就罷了,很可能不會深究到底

cmake .
cmake ..
make all
make -j4
make install

上述列出來的到底是什麼含義,直接機械式地先安裝依賴庫,經常用的也就是:

sudo apt-get install  #balala...一堆依賴庫的名字

安裝完依賴庫,通常就會:

mkdir build
cd build
cmake ..
make
make install

簡直是教科書般的標準流程,但是很多情況下,在camke這一塊兒就會出錯,LZ也是才接觸這些,之前碰到很多的cmake錯誤東一個部落格西一個部落格一查,雖然問題解決了,但也沒留下啥具體解決方案,或者報的錯誤是哪些,所以,LZ決定還是得新開一篇部落格,把碰到的cmake錯誤彙總到一起。

哈哈,cmake的時候每次應該都最怕看見:

Configuring incomplete errors occurred!/(ㄒoㄒ)/~~**

1.Cannot find source file. SRC_LIST. Tried extensions .c .C .c++ …add_executable called with incorrect number of arguments

這個cmake找不到對應的的檔案,LZ犯這個錯誤的原因是

#wrong one
add_executable(hello SRC_LIST)

#right one
add_executable(hello ${SRC_LIST})

這是為了輸出一個可執行檔案,第一行的程式碼是在找檔名為SRC_LIST的檔案,但實際上,這是LZ定義的一個變數,在cmake中引用定義的變數是要加${SRC_LIST}這個符號的。

2.make: … empty variable name. stop.

不存在空的變數名稱。停止。。。

這是因為輸入的make後面的變數並沒有定義好,LZ犯錯的原因如下:

#wrong one
make VERBOSE = 1

#right one
make VERBOSE=1

小夥伴看出來哪裡有不同的嘛?沒錯!等式左右LZ習慣性的打了空格,然後就光榮的報錯了/(ㄒoㄒ)/~~

上面程式碼的意思是可以看到make構建的詳細過程。

3.add_executable cannot create target “hello” because another target with the same name already exists. The existing target is an executable created in source directory

報錯都是一長段,習慣就好,主要看具體報錯的位置和錯誤型別,上面錯誤是LZ把兩個可執行檔案的檔名定義成一樣的了,那是肯定得報錯了,雙胞胎還得有不同呢。。。

4.Parse error in command line argument -DCMAKE_INSTALL_PREFIX. Should be: VAR: type=value CMake Error: No cmake script provided. CMake Error: Problem processing arguments. Aborting

其實,這個錯誤是在定義安裝目錄的時候報錯的,也就是使用-DCMAKE_INSTALL_PREFIX的時候出問題的,LZ把正確的和錯誤的還是都貼出來:

#wrong
cmake -DCMAKE_INSTALL_PREFIX = /tmp/t2/usr

#right
cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr

又是老問題,等式左右兩邊加了空格,這真的是寫程式碼的習慣性問題,所以這種編譯錯誤還是對於LZ來說會經常碰到。。。

5.CMake Warning(dev) in CMakeLists.txt: No cmake_minimum_required command is present. A line of code such as cmake_minimum_required(VERSION 2.8) should be added at the top of the file

這其實都不能算是個error,只是一個warning,如果在有些IDE當中,如果你沒有定義cmake的最低版本,它會幫你自動新增這行程式碼的:

cmake_minimum_required(VERSION 2.8)

cmake對於命令的大小寫不敏感,但是對於變數的大小寫是敏感的。還有一個問題,就是注意一下自己安裝的cmake的版本,不要設定的最低版本比你安裝的版本還要高,那就直接沒辦法編譯了。

怎麼檢視你的cmake版本?

#在終端中輸入
cmake --version

#終端顯示
cmake version 2.8.12.2

6.add_library cannot create target “hello” because another target with the same name already exists. The existing target is a shared library create in source directory

這是LZ在編譯動態庫和靜態庫出現的問題,如果直接把靜態庫和動態庫直接使用相同的命名的話,就會報上述的錯誤。

#wrong
add_library(hello SHARED ${LIBHELLO_SRC})
add_library(hello STATIC ${LIBHELLO_SRC})

#right(如果不要求靜態庫和動態庫的名字相同的話)
add_library(hello SHARED ${LIBHELLO_SRC})
add_library(hello_static STATIC ${LIBHELLO_SRC})

#right(如果需要兩個庫名字相同的話)
add_library(hello SHARED ${LIBHELLO_SRC})
add_library(hello STATIC ${LIBHELLO_SRC})
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")

7.CMAKE Error at lib/cmake_install.cmake:48(FILE): file INSTALL cannot copyfile, “source path” to “target path” Call stack(most recent call first):cmake_install.cmake:37(INCLUDE)

看到這個報錯LZ還是會一臉懵逼的,因為只是報一個無法拷貝檔案的問題,所以還是應該會想到是許可權不夠的問題,雖然有文章建議說安裝軟體的時候儘量不要用sudo但是,有些軟體不用sudo根本沒法安裝,這其實還是蠻矛盾的存在,所以咯:

#報錯的安裝方法
make install

#解決方案
sudo make install 

如果報permiss denied感覺錯誤應該更好找。。。

8.Cannot specify link libraries for target “curltest” which is not built by the project

其實LZ犯這個錯誤也是很愚蠢的,LZ先寫了target_link_libraries(curltest curl),然後定義的add_executable(curltest main.c),單純的把順序寫反了,所以程式找不到curltest的定義。。。真是一點都不智慧。還是沒有養成寫CMakeLists.txt的良好習慣。

9.Parse error.Function missing ending “)”. End of file reached

報的錯誤是解析錯誤,是因為圓括號不對稱,導致直接程式找到文章結尾了,注意查詢對應括號就行了。

其實還會遇到很多其它錯誤啦,只能遇到一個解決一個咯O(∩_∩)O