我是新来的。
我想要创建代码来创建一些类的实例(比如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)我编译这个项目并运行它。所以我只得到输出“你好,世界!”。
当我删除注释(main.cpp第5行)时,将使用ClassA实例。所以我也得到了Creator类的输出。ClassA的代码是链接的。
当我将类ClassA移到根目录时,它也能工作。
我还尝试使用PUBLIC_LINK、debug和general等参数来表示target_link_libraries。但什么都不管用。
我打算在这个main.cpp文件中使用一个集合类,并从集合中获取instanced对象。在main.ccp文件中,我不想知道每个实例类,因为所有类ClassA .ClassZ具有相同的接口(在本例中未显示)。
如何强制“未使用”代码的链接?
编辑:不知道是否必要。我用KDevelop4。
发布于 2015-11-14 21:08:35
我已经用GNU4.8.1编译器测试了您的代码,在您的示例中,只需将target_link_libraries()行替换为:
target_link_libraries(
teststaticcmake
PRIVATE
"-Wl,--whole-archive"
SubFolder
"-Wl,--no-whole-archive"
)来自target_link_libraries() 文档
更多参考资料
https://stackoverflow.com/questions/33709241
复制相似问题