E-r*_*ich 6 cmake ld undefined-reference
下面的项目结构是一个简化的例子.我试图将其归结为最少量的文件来重现我的问题.
.
??? CMakeLists.txt
??? subdir1
? ??? CMakeLists.txt
? ??? subsubdir1
? ??? CMakeLists.txt
? ??? Example.cpp
? ??? Example.h
??? subdir2
??? CMakeLists.txt
??? main.cpp
??? subsubdir1
??? CMakeLists.txt
??? ExampleCreator.cpp
??? ExampleCreator.h
Run Code Online (Sandbox Code Playgroud)
cmake_minimum_required(VERSION 2.8)
project(test)
macro(add_sources)
file (RELATIVE_PATH _relPath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
foreach (_src ${ARGN})
if (_relPath)
list (APPEND SRCS "${_relPath}/${_src}")
else()
list (APPEND SRCS "${_src}")
endif()
endforeach()
if (_relPath)
# propagate SRCS to parent directory
set (SRCS ${SRCS} PARENT_SCOPE)
endif()
endmacro()
add_subdirectory(subdir1)
add_subdirectory(subdir2)
add_executable(test ${SRCS})
Run Code Online (Sandbox Code Playgroud)
add_subdirectory(subsubdir1)
Run Code Online (Sandbox Code Playgroud)
add_sources(Example.cpp)
Run Code Online (Sandbox Code Playgroud)
#ifndef EXAMPLE_H
#define EXAMPLE_H
class Example
{
public:
Example();
virtual ~Example();
};
#endif
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include "Example.h"
Example::Example()
{
printf("Inside Example constructor\n");
}
Example::~Example()
{
}
Run Code Online (Sandbox Code Playgroud)
add_subdirectory(subsubdir1)
add_sources(main.cpp)
Run Code Online (Sandbox Code Playgroud)
#include "subsubdir1/ExampleCreator.h"
int main(int argc, char** argv)
{
ExampleCreator creator;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
add_sources(ExampleCreator.cpp)
Run Code Online (Sandbox Code Playgroud)
#ifndef EXAMPLE_CREATOR_H
#define EXAMPLE_CREATOR_H
class ExampleCreator
{
public:
ExampleCreator();
virtual ~ExampleCreator();
};
#endif
Run Code Online (Sandbox Code Playgroud)
#include "ExampleCreator.h"
#include "../../subdir1/subsubdir1/Example.h"
ExampleCreator::ExampleCreator()
{
Example* ex1 = new Example();
}
ExampleCreator::~ExampleCreator()
{
}
Run Code Online (Sandbox Code Playgroud)
我希望这是一个非常简单的缺乏理解CMake如何处理依赖关系.这编译没有错误,但在链接期间失败.make下面的输出显示Example.cpp甚至没有编译,我不明白为什么.
user>:~/src/test/build$ make
Scanning dependencies of target test
[ 50%] Building CXX object CMakeFiles/test.dir/subdir2/subsubdir1/ExampleCreator.cpp.o
[100%] Building CXX object CMakeFiles/test.dir/subdir2/main.cpp.o
Linking CXX executable test
CMakeFiles/test.dir/subdir2/subsubdir1/ExampleCreator.cpp.o: In function `ExampleCreator::ExampleCreator()':
ExampleCreator.cpp:(.text+0x2b): undefined reference to `Example::Example()'
collect2: ld returned 1 exit status
make[2]: *** [test] Error 1
make[1]: *** [CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
根据我的判断,所有源都附加到SRCS根CMakeLists.txt文件中的变量.那么,为什么不Example.cpp编译?或链接?
该目录subdir1不生成二进制文件.添加这个:
project(Example)
add_library(Example Example.cpp)
Run Code Online (Sandbox Code Playgroud)
而不是你的add_sources.在此之后,您需要告诉使用它链接的项目:
TARGET_LINK_LIBRARIES(subdir2 Example)
Run Code Online (Sandbox Code Playgroud)
如果您的名字不同,请记录这些命令的功能.