【问题标题】:Linking shared dll library cmake clion project链接共享 dll 库 cmake clion 项目
【发布时间】:2017-04-28 13:06:49
【问题描述】:

我目前在 Clion 上有两个使用 cmake 的 C 项目。其中一个项目名为“sharedLibsDemo”,我正在尝试在该项目中创建一个共享库。在另一个项目中,我想使用由“共享”项目创建的库。

目前,在“sharedLibsDemo”项目中,我有以下 cmake:

cmake_minimum_required(VERSION 3.7)
project(sharedLibsDemo)

set(CMAKE_C_STANDARD 11)
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}")
set(SOURCE_FILES shared.c shared.h main.c)
add_library(shared SHARED ${SOURCE_FILES})
include(GenerateExportHeader)
GENERATE_EXPORT_HEADER(shared           # generates the export header shared_EXPORTS.h automatically
        BASE_NAME shared
        EXPORT_MACRO_NAME SHARED_EXPORTS
        EXPORT_FILE_NAME shared_EXPORTS.h
        STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC) 

set(EXEC_FILES main.c)
add_executable(myexe ${EXEC_FILES})
target_link_libraries(myexe shared)

但是,此 cmake 仅创建 shared_EXPORTS.h、libshared.dll 和 libshared.dll.a` 文件。 我设法使用 Mingw 本身创建了 .lib 文件,并将所有这些文件(包括源代码的 .h 文件)放在一个文件夹中,并将该文件夹放在第二个项目的根文件夹中以便使用它。

但是,我到处寻找将库链接到第二个项目的可执行文件的方法。 cmake 本身的文档假设我有很多我没有的知识。是否有任何命令列表可用于最终链接我的库。我已经尝试过“使用 find_package() 或 target_link_libraries”的通用答案,但无济于事。

编辑 1

以下是shared.h的内容:

#include "shared_EXPORTS.h"
#ifndef SHAREDLIBSDEMO_LIBRARY_H
#define SHAREDLIBSDEMO_LIBRARY_H

void SHARED_EXPORTS sharedHello(void);

#endif

根据@Shmuel H 的建议。我将shared.h shared.cshared 项目的cmakelist.txt 放入项目中我想包含库的文件夹中。我使用了add_subdirectory() 和 target_link_libraries()。

以下是项目的CMakeLists.txt

cmake_minimum_required(VERSION 3.7)
project(projectFiles)

set(CMAKE_C_STANDARD 11)
include_directories(src ${maker_INCLUDE_DIR})
set(SOURCE_FILES src/nv_runner/main.c src/FactParser/FactParser.c src/FactParser/FactParser.h src/Utils/Utils.c src/Utils/Utils.h src/nv_runner/main.h)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
find_package(maker REQUIRED)

include_directories(${maker_INCLUDE_DIR})

set(LIBSHARED_LOCATION ${PROJECT_SOURCE_DIR}/libshared)
add_subdirectory(libshared)
include_directories(${LIBSHARED_LOCATION})

add_executable(${PROJECT_NAME} ${SOURCE_FILES} src/FactParser/FactParser.c src/FactParser/FactParser.c src/FactParser/FactParser.h src/nv_runner/main.h)

target_link_libraries(${PROJECT_NAME} ${maker_LIBRARY})
target_link_libraries(${PROJECT_NAME} shared)

起初,我不得不从 sharedHello 函数中删除 SHARED_EXPORTS 宏,并在 shared.h 中包含 shared_EXPORTS.h ,否则它无法识别该函数以用于其他文件。但是当我运行程序时,我得到了这个结果:

Process finished with exit code -1073741515 (0xC0000135)

编辑 2

Project setup image

在屏幕截图中,我从shared 项目中获取了所有必要的文件,将其放在当前项目的一个目录中,并将该目录标记为库。可以在图像中看到 cmake。使用此设置,每当我运行我的程序时,它都会因图像中看到的错误而崩溃。

【问题讨论】:

  • 我无法理解这个问题。要将shared 链接到myexe 吗?结果如何?预期的结果是什么?你能提供cmakecmake --builld的输出吗?
  • 我提供的cmake是sharedLibsDemo项目的。该项目中的exe仅供我测试。我真正想要完成的就是能够把这个cmake生成的库拿来用在其他clion/cmake项目中
  • 那么,您应该将此目录作为子目录包含在您的项目中。例如,如果你有项目Base,并且你想使用这个cmake文件中的目标shared,你应该在add_subdirectory中包含if,然后你可以在Base的CMakeLists.txt中使用它(例如target_link_libraries(myexe shared))
  • 我现在就试试,但这是创建和使用库的标准做法吗?如果我开始一个全新的项目并且我只需要来自 shared 的函数等,或者我想将此库贡献给其他项目,这是标准的方式吗?

标签: c dll cmake clion


【解决方案1】:

我发现了问题所在。我不知道 dll 必须与 exe 位于同一文件夹中,这就是程序未执行的原因。一旦我将 .dll 文件放在 exe 文件夹中,它就可以工作了。 感谢这个问题帮助我识别问题:C++ running file with included library failes without compiling error (CMake / CLion)

我发现 .lib 文件只对 MSVC 编译器是必需的。 MinGW 使用.dll.a 文件;替换.lib。这篇文章让我发现了这一点:Compatibility of *.dll *.a *.lib *.def between VisualStudio and gcc

如果我错了,请纠正我。这是我当前项目和 cmake 设置的image

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多