【问题标题】:How to build executable and shared libraries in same cmake project on windows/msvs如何在 windows/msvs 上的同一 cmake 项目中构建可执行和共享库
【发布时间】:2013-07-14 21:43:50
【问题描述】:

我想做的是:

  • 创建一个共享库并导出其 API 以供其他程序使用
  • 在使用该库的同一项目中创建一个简单的可执行文件(以展示如何使用该库的具体示例
  • 使用 cmake 构建,必须使用 Visual Studio (2010) 和 windows 7

我试过这段代码(快速测试用例):

CMakeLists.txt

PROJECT (minimalcpp)
CMAKE_MINIMUM_REQUIRED (VERSION 2.6)

SET(LIBSAMPLE_HEADERS func_simple.h)
SET(LIBSAMPLE_SRCS func_simple.cpp)

ADD_LIBRARY (minimalcpp SHARED ${LIBSAMPLE_SRCS})

ADD_EXECUTABLE (test-pure-cpp test-pure-cpp.cpp)
TARGET_LINK_LIBRARIES (test-pure-cpp minimalcpp)

# THIS WORKS BUT IT IS NOT WHAT I WANT :
# ADD_EXECUTABLE (test-pure-cpp test-pure-cpp.cpp ${LIBSAMPLE_SRCS})

宏.h

#ifndef MACROS_H
#define MACROS_H

#if defined _WIN32 || defined __CYGWIN__
    #if minimalcpp_EXPORTS
        #define MINIMALCPP_API __declspec(dllexport)
    #else
        #define MINIMALCPP_API __declspec(dllimport)
    #endif
#endif

#endif

func_simple.h

#ifndef LIB_SAMPLE_FUNC_SIMPLE_H
#define LIB_SAMPLE_FUNC_SIMPLE_H

#include "macros.h"

namespace sample {
MINIMALCPP_API void f1(int nmax);
}

#endif // LIB_SAMPLE_FUNC_SIMPLE_H

func_simple.cpp

#include <iostream>
#include "func_simple.h"

void sample::f1(int nmax) {
  int i ;
  for(i=0 ; i < nmax ; i++) {
    std::cout << i << " -> " << i*i << std::endl;
  }
}

test-pure-cpp.cpp

#include "func_simple.h"

int main(int argc, char *argv[]){
    sample::f1(5);
    return 0;
}

此代码编译但在执行时直接崩溃。

错误信息:

Le programme s'est terminé subitement.
... a quitté avec le code -1073741515

我是 Windows 上的 C++ 初学者,我做错了什么? 非常感谢

【问题讨论】:

  • 您是否尝试过首先使用静态库编译和运行,然后它是否有效?可能是您在声明XY Problem。另一个问题可能是windows没有找到你的DLL,你需要在PATH变量中指定它的目录。
  • 您发布的代码很好,并且可以在我的机器上使用 VS2010 正常工作。问题可能出在您的test-pure-cpp.cpp 上吗?
  • 我在示例中添加了 test-pure-cpp 源代码。如果我将它编译为静态库(并且在删除 __declspec(...) 之后),它会起作用
  • 最好的答案是 windows 找不到你的 DLL !!!非常感谢。我无法想象在这样一个简单的问题上浪费了这么多时间......而且我无法想象有这样的消息来解决这类问题(也许我太习惯于 linux/gcc 会引发更明确的消息对我来说)

标签: c++ visual-studio-2010 cmake shared-libraries


【解决方案1】:

见 [g-makulik] 答案:

在这种情况下,此消息意味着找不到 dll,这就是应用程序崩溃的原因。 一种解决方案是让 cmake 将 dll 和可执行文件放在同一目录中,例如 bin 中:

SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

此约定用于 Qt 等库中。

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 2021-07-17
    • 2017-10-26
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多