2017-08-11 48 views
-1

我是cmake的新手,知道這個問題之前已經被問過了,但是還是找不到我做錯了什麼。我有一個外部庫文件夾/includelib/include文件夾包含所有標題(.h)和/lib文件夾包含所有源文件(.c)。cmake - undefined參考

在我的項目我有這個CMakeList.txt文件:

cmake_minimum_required(VERSION 3.7) 
project(FirstAttempt) 

set(CMAKE_CXX_STANDARD 11) 

set (EXTRA_LIBS "D:\\libtrading") 

include_directories(${EXTRA_LIBS}/include) 
link_directories(${EXTRA_LIBS}/include) 

set(SOURCE_FILES main.cpp) 
add_executable(FirstAttempt ${SOURCE_FILES}) 

target_link_libraries (FirstAttempt ${EXTRA_LIBS}/lib) 

我知道,我必須使用target_link_libraries到庫的源文件鏈接到我的項目,但肯定缺少的東西,但什麼?我仍然收到錯誤undefined reference to xxxxxx

我想包括在我的項目中的庫是https://github.com/libtrading/libtrading

回答

0

嗯,我會試試。

首先,看起來你打電話給link_directories()就是包含頭文件的文件夾,而it should be used in order to specify the path where to search libraries for

其次target_link_libraries()takes the absolute path作爲第二個參數的共享/靜態庫文件,當你傳遞目錄路徑(好吧,似乎是這樣)。

target_link_libraries()未鏈接到「庫的源文件」, - 它鏈接到已編譯的共享/靜態庫blob。

而且,我也建議你到可執行文件的名稱保存到變量,這樣你不就能夠輸錯對象名稱,例如:

set(TARGET FirstAttempt) 
add_executable(${TARGET}) 
0

如你所知,我們需要編譯所有源文件。所以我們需要指出Cmake知道源文件在哪裏/什麼。

我想你應該添加這樣

file(GLOB SOURCES_FILES "lib/*.c" main.cpp) 

所有源文件添加的所有.c文件。

或者,您可以添加所有的lib/*。.c文件分別

file(SOURCES_FILES_LIBS "lib/*.c") 
set(SOURCES_FILES main.cpp) 
add_executable(FirstAttempt ${SOURCES_FILES_LIBS} ${SOURCES_FILES}) 
+0

是否'file'命令使用相對或絕對目錄? –

+0

[相對路徑](https://cmake.org/cmake/help/v3.0/command/file.html) – GAVD

+0

似乎我需要將庫添加爲主項目的子目錄。這是否是唯一的方法來做到這一點? –