2016-05-12 57 views
1

我正在將手動Makefiles中的現有項目切換到CMake(因爲項目變得相當大),但是當我運行鏈接的可執行文件時出現問題到我創建的共享庫。CMake沒有創建可訪問我的共享庫的可執行文件

的我的目錄結構如下:

--CMakeLists.txt 
--include 
    | 
    --include_files.h 
--src 
    | 
    --src_files.cpp 
--test 
    | 
    --CMakeLists.txt 
    --test1.cpp 

的的CMakeLists.txt在根目錄如下:

project(Project) 
include_directories(${PROJECT_SOURCE_DIR}/include/) 
file(GLOB SOURCES "${PROJECT_SOURCE_DIR}/src/*.cpp") 
add_library(Project SHARED ${SOURCES}) 
include_directories($ENV{EXTERN_INCLUDE}/lnInclude) 
target_link_libraries(Project PRIVATE "$ENV{EXTERN_LIBBIN}/libextern.so") 
add_subdirectory(test) 

的的CMakeLists.txt在測試目錄如下:

cmake_minimum_required(VERSION 2.8.9) 
include_directories(${PROJECT_SOURCE_DIR}/include/) 
add_executable(test1 test1.cpp) 
include_directories($ENV{EXTERN_INCLUDE}/lnInclude) 
target_link_libraries(test1 PRIVATE "$ENV{EXTERN_LIBBIN}/libextern.so") 
add_dependencies(test1 Project) 
target_link_libraries(test1 PUBLIC ${CMAKE_BINARY_DIR}/libProject.so) 

當我運行cmake,然後make,共享庫libProject.so被構建(n o錯誤),並創建了可執行文件test1,但運行test1時,運行時會出現錯誤。

如果我添加在test目錄,可執行文件和共享庫都建立這些線路到的CMakeLists.txt,並完美地工作:

file(GLOB SOURCES "${PROJECT_SOURCE_DIR}/src/*.cpp") 
add_executable(test1 test1.cpp ${SOURCES}) 

這並不理想,雖然,因爲這意味着我編譯兩次src。

我也嘗試手動構建測試的Makefile,但不是共享庫,並且這工作正常,無需重新編譯src。這讓我覺得這個問題是由於我使用了cmake。

我的問題是:如何使用CMake將測試可執行文件與共享庫正確鏈接?

運行時錯誤的一個例子如下:

A was returned outside range, A=-nan 

裏面的測試功能,我構造一個類,並通過它的一些信息(節點在包括定義並編譯成libProject.so):

Node& station1(*new Node(station1)); 
station1.X(X); 
station1.Y(Y); 
station1.Z(Z); 

然後我打電話之類的功能:

station1.A(); 

我希望這本功能以在預定範圍內返回一個數字,但事實並非如此。

這是GDB這讓我懷疑的共享庫沒有被加載輸出:

Function "Node::A()" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 3 (Node::A()) pending. 
(gdb) continue 
Continuing. 
terminate called after throwing an instance of 'std::range_error' 
what(): Error: A lower than 0 
+0

請編輯您的問題以包含運行時錯誤。以文本形式複製粘貼最終輸出。 –

回答

1

對於test1目標,不要手動添加依賴於Project或鏈路與libProject.so文件。

取而代之,讓CMake處理所有事情,只需執行

include_directories(${PROJECT_SOURCE_DIR}/include/) 
add_executable(test1 test1.cpp) 
target_link_libraries(test1 Project) 

請注意,我也刪除了extern依賴項。如果測試程序實際上沒有使用該庫,則不需要。

相關問題