我想做的是:

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

    测试纯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++的初学者,我做错了什么?
    非常感谢你

    最佳答案

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

    07-24 09:46
    查看更多