CMake没有创建可访问我的共享库

时间:2016-05-12 10:40:52

标签: c++ makefile cmake

我正在努力将现有项目从手动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)

测试目录中的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时,运行时会出现错误。

如果我将这些行添加到测试目录中的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

1 个答案:

答案 0 :(得分:2)

对于test1目标,请勿手动将依赖关系添加到Project或与libProject.so文件关联。

而是让CMake处理所有事情,只需做一些事情。

include_directories(${PROJECT_SOURCE_DIR}/include/)
add_executable(test1 test1.cpp)
target_link_libraries(test1 Project)

请注意,我还删除了extern依赖项。如果测试程序实际上没有使用该库,则不需要..