Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 让CMake为MSVC构建共享库 我在Cube中使用UNIX环境构建C和C++项目。然而,我也想开始在MSVC中编译,我正试图了解cmake文档,但我被卡住了。 当我尝试构建时,我不断收到以下消息_Visual C++_Cmake - Fatal编程技术网

Visual c++ 让CMake为MSVC构建共享库 我在Cube中使用UNIX环境构建C和C++项目。然而,我也想开始在MSVC中编译,我正试图了解cmake文档,但我被卡住了。 当我尝试构建时,我不断收到以下消息

Visual c++ 让CMake为MSVC构建共享库 我在Cube中使用UNIX环境构建C和C++项目。然而,我也想开始在MSVC中编译,我正试图了解cmake文档,但我被卡住了。 当我尝试构建时,我不断收到以下消息,visual-c++,cmake,Visual C++,Cmake,链接:致命错误LNK1104:无法打开文件“Debug\MyLibrary.lib”[C:\sandbox\projects\cpp\DummyChelloWorld\build\ma inProgram.vcxproj] 你能告诉我我做错了什么吗 CMakeLists.txt cmake_minimum_required(VERSION 3.4) project(helloWorld) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -

链接:致命错误LNK1104:无法打开文件“Debug\MyLibrary.lib”[C:\sandbox\projects\cpp\DummyChelloWorld\build\ma inProgram.vcxproj]

你能告诉我我做错了什么吗

CMakeLists.txt

    cmake_minimum_required(VERSION 3.4)
    project(helloWorld)

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    include(GenerateExportHeader)

    ADD_LIBRARY(MyLibrary SHARED myShared.cpp)

    set(SOURCE_FILES main.cpp)

    GENERATE_EXPORT_HEADER( MyLibrary
                 BASE_NAME MyLibrary
                 EXPORT_MACRO_NAME MyLibrary_EXPORT
                 EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/MyLibrary_Export.h
                 STATIC_DEFINE MyLibrary_BUILT_AS_STATIC
            )

    add_executable(mainProgram ${SOURCE_FILES})
    TARGET_LINK_LIBRARIES(mainProgram MyLibrary)
    TARGET_INCLUDE_DIRECTORIES(mainProgram PUBLIC exports)
main.cpp

#include "myShared.h"

int main() {
  sayHI();
  return 0;
}
myShared.cpp

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

using namespace std;

void sayHI() {
  cout << "Hello World lib" << endl;
}
把我的评论变成答案

对于CMake版本>=3.4

只需使用:

用于CMake版本<3.4

您需要声明导出的函数/符号。因此,在您的情况下,您必须修改以下文件:

myShared.h

#ifndef HELLOWORLD_HELLO_H
#define HELLOWORLD_HELLO_H

#include "MyLibrary_Export.h"

void MyLibrary_EXPORT sayHI();

#endif //HELLOWORLD_HELLO_H
CMakeLists.txt

cmake_minimum_required(VERSION 3.4)
project(helloWorld)

set(CMAKE_CXX_STANDARD 11)
include(GenerateExportHeader)

add_library(
    MyLibrary 
    SHARED 
        myShared.cpp
        myShared.h
        MyLibrary_Export.h   
)
GENERATE_EXPORT_HEADER( 
    MyLibrary
    BASE_NAME MyLibrary
    EXPORT_MACRO_NAME MyLibrary_EXPORT
    EXPORT_FILE_NAME MyLibrary_Export.h
    STATIC_DEFINE MyLibrary_BUILT_AS_STATIC
)
target_include_directories(MyLibrary PUBLIC "${CMAKE_CURRENT_BINARY_DIR}")

set(SOURCE_FILES main.cpp)
add_executable(mainProgram ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(mainProgram MyLibrary)
我已经

  • 在函数声明中添加了
    MyLibrary\u EXPORT
  • 将添加到共享库的包含路径(指向生成的导出定义标头)
  • 使用了更跨平台的定义
  • 备选方案

    参考资料


    TARGET\u INCLUDE\u目录(mainProgram PUBLIC exports})-我认为末尾有一个不需要的大括号。谢谢,捕捉得很好,但这是一个复制粘贴错误。我在帖子中更正了它。还是一样的问题。不过对细节很有眼光。文件可能被意外锁定。尝试从一个干净的构建目录。我主要使用GCC/MinGW,所以使用MSVC对我来说是新的,所以感谢你对我提出任何愚蠢的问题。我是否需要硬编码所有库中的“#include MyLibrary_Export.h”以及我是否需要硬编码“MyLibrary_Export”如果您使用CMake 3.4或更高版本,并且只想导出所有符号,则只需定义
    CMake\u WINDOWS\u导出\u所有符号即可。对于完整的解决方案,请参阅下面我的答案。它是有效的!!!这解决了一切。我对你感激不尽。这让我希望学习这些绝妙的技巧会容易得多。
    
    #ifndef HELLOWORLD_HELLO_H
    #define HELLOWORLD_HELLO_H
    
    #include "MyLibrary_Export.h"
    
    void MyLibrary_EXPORT sayHI();
    
    #endif //HELLOWORLD_HELLO_H
    
    cmake_minimum_required(VERSION 3.4)
    project(helloWorld)
    
    set(CMAKE_CXX_STANDARD 11)
    include(GenerateExportHeader)
    
    add_library(
        MyLibrary 
        SHARED 
            myShared.cpp
            myShared.h
            MyLibrary_Export.h   
    )
    GENERATE_EXPORT_HEADER( 
        MyLibrary
        BASE_NAME MyLibrary
        EXPORT_MACRO_NAME MyLibrary_EXPORT
        EXPORT_FILE_NAME MyLibrary_Export.h
        STATIC_DEFINE MyLibrary_BUILT_AS_STATIC
    )
    target_include_directories(MyLibrary PUBLIC "${CMAKE_CURRENT_BINARY_DIR}")
    
    set(SOURCE_FILES main.cpp)
    add_executable(mainProgram ${SOURCE_FILES})
    TARGET_LINK_LIBRARIES(mainProgram MyLibrary)