簡體   English   中英

CMake 沒有創建可以訪問我的共享庫的可執行文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM