2016-05-12 61 views
1

我正在将手动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 
+0

请编辑您的问题以包含运行时错误。以文本形式复制粘贴最终输出。 –

回答

1

对于test1目标,不要手动添加依赖于Project或链路与libProject.so文件。

取而代之,让CMake处理所有事情,只需执行

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

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

相关问题