首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake链接不是子文件夹

CMake链接不是子文件夹
EN

Stack Overflow用户
提问于 2015-11-14 14:04:25
回答 1查看 268关注 0票数 1

我是新来的。

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

我的文件夹结构如下

代码语言:javascript
复制
├── CMakeLists.txt
├── main.cpp
└── SubFolder
    ├── ClassA.cpp
    ├── ClassA.h
    ├── CMakeLists.txt
    └── Creator.h

./main.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
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

代码语言:javascript
复制
#ifndef __CLASSA__
#define __CLASSA__

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

子文件夹/ClassA.cpp

代码语言:javascript
复制
#include "ClassA.h"
#include "Creator.h"

classA::classA()
{
}

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

子文件夹/Creator.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
add_library(SubFolder ClassA.cpp)

我编译这个项目并运行它。所以我只得到输出“你好,世界!”。

当我删除注释(main.cpp第5行)时,将使用ClassA实例。所以我也得到了Creator类的输出。ClassA的代码是链接的。

当我将类ClassA移到根目录时,它也能工作。

我还尝试使用PUBLIC_LINKdebuggeneral等参数来表示target_link_libraries。但什么都不管用。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-14 21:08:35

请参阅如何强迫gcc链接一个未使用的静态库

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

代码语言:javascript
复制
target_link_libraries(
    teststaticcmake 
    PRIVATE
        "-Wl,--whole-archive" 
        SubFolder 
        "-Wl,--no-whole-archive"
)

来自target_link_libraries() 文档

  • 链接标志:以-开头的项目名称,而不是-l或-framework,被视为链接器标志。请注意,出于传递依赖关系的目的,此类标志将被视为任何其他库链接项,因此它们通常只指定为不传播到受抚养人的私有链接项。

更多参考资料

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33709241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档