gpt4 book ai didi

c++ - CMake 链接不是子文件夹

转载 作者:太空宇宙 更新时间:2023-11-04 13:24:54 26 4
gpt4 key购买 nike

我是 cmake 新手。

我想创建代码来创建某些类(如 ClassA)的实例并将它们收集到处理程序类中。为此,我创建了一个模板类 Creator。在每个类实现中,此类的一个实例是使用 Creator 类创建的。 (参见 ClassA.cpp 第 8 行)

我有以下文件夹结构

├── CMakeLists.txt
├── main.cpp
└── SubFolder
├── ClassA.cpp
├── ClassA.h
├── CMakeLists.txt
└── Creator.h

./main.cpp

#include <iostream>
#include "SubFolder/ClassA.h"

int main(int argc, char **argv) {
//classA a;

std::cout << std::endl << "Hello, world!" << std::endl;
return 0;
}

./CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(teststaticcmake)

add_executable(teststaticcmake main.cpp)
add_subdirectory(SubFolder)
target_link_libraries(teststaticcmake SubFolder)

install(TARGETS teststaticcmake RUNTIME DESTINATION bin)

子文件夹/ClassA.h

#ifndef __CLASSA__
#define __CLASSA__

class classA
{
public:
classA();
};
#endif //__CLASSA__

子文件夹/ClassA.cpp

#include "ClassA.h"
#include "Creator.h"

classA::classA()
{
}

classA* pClassA = Creator<classA>::create();

子文件夹/Creator.h

#ifndef __CREATOR__
#define __CREATOR__

#include <iostream>

template<typename T>
class Creator
{
public:
static T* create()
{
T* p = new T();

// Do Something here
// ... like output
std::cout << std::endl << "created: " << p;

return p;
}
};
#endif //__CREATOR__

子文件夹/CMakeLists.txt

add_library(SubFolder ClassA.cpp)

我编译这个项目并运行它。所以我只得到输出“Hello, world!”。
当我删除注释(main.cpp 第 5 行)时,使用了一个 ClassA 实例。所以我也得到类 Creator 的输出。 ClassA 的代码已链接。
当我将类 ClassA 移动到根目录时,它也可以工作。

我还尝试为 target_link_libraries 使用 PUBLIC_LINKdebuggeneral 等参数。但没有任何效果。

我打算在此 main.cpp 文件中使用集合类并从集合中获取实例化对象。在 main.ccp 文件中,我不想知道每个实例化类,因为所有类 ClassA ... ClassZ 都有相同的接口(interface)(本例中未显示)。

如何强制链接“未使用”代码?

编辑:不知道是否有必要。我使用 KDevelop4。

最佳答案

参见 How to force gcc to link an unused static library

我已经使用 GNU 4.8.1 编译器测试了您的代码,在您的示例中,只需将 target_link_libraries() 行替换为:

target_link_libraries(
teststaticcmake
PRIVATE
"-Wl,--whole-archive"
SubFolder
"-Wl,--no-whole-archive"
)

来自 target_link_libraries() documentation :

  • A link flag: Item names starting with -, but not -l or -framework, are treated as linker flags. Note that such flags will be treated like any other library link item for purposes of transitive dependencies, so they are generally safe to specify only as private link items that will not propagate to dependents.

更多引用资料

关于c++ - CMake 链接不是子文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33709241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com