我正在將手動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
請編輯您的問題以包含運行時錯誤。以文本形式複製粘貼最終輸出。 –