繁体   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