C++ 如何在windows/MSV上的同一cmake项目中构建可执行库和共享库

C++ 如何在windows/MSV上的同一cmake项目中构建可执行库和共享库,c++,visual-studio-2010,cmake,shared-libraries,C++,Visual Studio 2010,Cmake,Shared Libraries,我想做的是: 创建共享库并导出其API以供其他程序使用 在使用库的同一项目中创建一个简单的可执行文件(例如,显示如何使用库的具体示例) 使用cmake构建,必须与Visual Studio(2010)和windows 7配合使用 我尝试了以下代码(快速测试用例): CMakeLists.txt PROJECT (minimalcpp) CMAKE_MINIMUM_REQUIRED (VERSION 2.6) SET(LIBSAMPLE_HEADERS func_simple.h) SET(

我想做的是:

  • 创建共享库并导出其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})

#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;
  }
}
此代码可编译,但在执行时直接崩溃

错误消息:

Le programme s'est terminé subitement.
... a quitté avec le code -1073741515
我是Windows上C++初学者,我做错了什么?
非常感谢

参见[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之类的库中使用此约定。

您是否先尝试使用静态库编译和运行,然后它工作了吗?可能是您正在声明一个。另一个问题可能是windows找不到您的DLL,您需要在
PATH
变量中指定它的目录。您发布的代码很好,并且使用VS2010在我的机器上按预期工作。问题可能出在您的
测试纯cpp.cpp
中吗?我在示例中添加了测试纯cpp源代码。如果我将其编译为静态库(并且在删除u declspec(…)之后),它就会工作很好的答案是windows找不到您的DLL!!!非常感谢。我无法想象在这样一个简单的问题上浪费了这么多时间…我也无法想象在这种问题上会有这样的消息(可能我太习惯linux/gcc了,这会给我带来更明确的消息)
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)