我正在将手动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
请编辑您的问题以包含运行时错误。以文本形式复制粘贴最终输出。 –