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