[英]CMake is not creating executables with access to my shared library
我正在努力將現有項目從手動 Makefile 切換到 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)
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(沒有錯誤),並創建了可執行文件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
在測試函數中,我構造了一個類並向其傳遞了一些信息(節點在 include 中定義並編譯到 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
對於test1
目標,不要手動將依賴項添加到Project
或與libProject.so
文件鏈接。
而是讓 CMake 處理一切,只需執行 eg
include_directories(${PROJECT_SOURCE_DIR}/include/)
add_executable(test1 test1.cpp)
target_link_libraries(test1 Project)
請注意,我還刪除了extern
依賴項。 如果測試程序實際上不使用該庫,則不需要它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.