C++工程,cmake,cmake生成so包并调用

1,目录结构

在这里插入图片描述

2,代码清单

2.1,utils.h

#ifndef __UTILS_H__
#define __UTILS_H__

#include <iostream>

class Utils {
    private:

    public:
        static void print(std::string str);
};

void print(std::string str);

#endif

2.2,utils.cpp

#include "utils.h"

void Utils::print(std::string str) {
    std::cout << "utils print:" << str << std::endl;
}

void print(std::string str) {
    std::cout << "print:" << str << std::endl;
}

2.3,main.cpp

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

int main() {
    std::string str = "hello";
    Utils::print(str);
    print(str);
    std::cout << "hellow world!" << std::endl;
    return 0;
}

2.4,顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

if(CMAKE_COMPILER_IS_GNUCC)
    message("COMPILER IS GNUCC")
        ADD_DEFINITIONS ( -std=c++11 )
endif(CMAKE_COMPILER_IS_GNUCC)

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -ggdb3")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/module)
ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/process)

2.5,so包(module)CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(module)

if(CMAKE_COMPILER_IS_GNUCC)
    message("COMPILER IS GNUCC")
        ADD_DEFINITIONS ( -std=c++11 )
endif(CMAKE_COMPILER_IS_GNUCC)

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -ggdb3")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# 3. opencv
#link_directories("/usr/local/lib")
#include_directories("/usr/local/include/opencv4")

# 5. 添加头文件路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/utils)
# 6. 添加源文件
FILE(GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${SOURCE_FILES})
# 7. 添加链接库
#LINK_LIBRARIES(opencv_core opencv_highgui)

# 9. 设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,
#但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
SET(ALL_SRCS ${SOURCE_FILES})
message(${ALL_SRCS})

# 生成so包
ADD_LIBRARY(${PROJECT_NAME} SHARED ${ALL_SRCS})

# 10.add executable file,添加要编译的可执行文件
#ADD_EXECUTABLE(${PROJECT_NAME} ${ALL_SRCS})

2.6,工程(process)CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(hello)

if(CMAKE_COMPILER_IS_GNUCC)
    message("COMPILER IS GNUCC")
        ADD_DEFINITIONS ( -std=c++11 )
endif(CMAKE_COMPILER_IS_GNUCC)

#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -ggdb3")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

# 5. 添加头文件路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/module/include/utils)
# 6. 添加源文件
FILE(GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${SOURCE_FILES})
# 7. 添加链接库

LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/module)
LINK_LIBRARIES(module)


# 9. 设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,
#但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
SET(ALL_SRCS ${SOURCE_FILES})
message(${ALL_SRCS})

# 10.add executable file,添加要编译的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${ALL_SRCS})

# 不可以
#TARGET_LINK_LIBRARIES(${CMAKE_BINARY_DIR}/module/libmodule.so)

3,编译运行

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 C++调用 C# DLL,您需要使用 C++/CLI 中介。C++/CLI 是一种 C++ 扩展,可以让您使用 .NET 类型和对象。这意味着您可以编写 C++/CLI 代码来调用 .NET 程序集中的类和方法。 下面是一个简单的示例,展示了如何使用 C++/CLI 从 C++调用 C# DLL 中的方法。 首先,您需要编写 C++/CLI 包装器类,该类将调用 C# DLL 中的方法。例如,假设您的 C# DLL 包含一个名为 `MyClass` 的类,并且该类有一个名为 `MyMethod` 的方法,您可以编写以下 C++/CLI 代码: ```cpp #pragma once using namespace System; using namespace System::Runtime::InteropServices; namespace MyNamespace { public ref class MyClassWrapper { private: IntPtr m_handle; public: MyClassWrapper() { m_handle = LoadLibrary("MyDll.dll"); } ~MyClassWrapper() { FreeLibrary((HMODULE)m_handle.ToPointer()); } int MyMethod(int arg1, int arg2) { typedef int(__stdcall *MyMethodFunc)(int, int); MyMethodFunc myMethod = (MyMethodFunc)GetProcAddress((HMODULE)m_handle.ToPointer(), "MyMethod"); return myMethod(arg1, arg2); } }; } ``` 这个包装器类将加载 C# DLL 并调用 `MyMethod` 方法。请注意,`MyMethod` 方法的签名必须与 C# DLL 中的方法签名匹配。在此示例中,假设 `MyMethod` 是一个 `int` 返回类型的方法,它接受两个 `int` 参数。 接下来,您需要在 C++ 代码中使用 C++/CLI 包装器类。例如,您可以编写以下 C++ 代码: ```cpp #include <iostream> #include "MyClassWrapper.h" using namespace std; using namespace MyNamespace; int main() { MyClassWrapper^ wrapper = gcnew MyClassWrapper(); int result = wrapper->MyMethod(1, 2); cout << "Result: " << result << endl; return 0; } ``` 这将创建一个 `MyClassWrapper` 对象,并调用 `MyMethod` 方法。请注意,您需要使用 `^` 符号来声明包装器类的引用。 最后,您需要使用 CMake 编译您的代码。您需要确保将 C++/CLI 文件添加到项目中,并将 C# DLL 文件添加到可执行文件的目录中。例如,您可以编写以下 CMakeLists.txt 文件: ``` cmake_minimum_required(VERSION 3.10) project(MyProject) set(CMAKE_CXX_STANDARD 11) add_executable(MyExecutable main.cpp MyClassWrapper.cpp) set_property(TARGET MyExecutable PROPERTY VS_DOTNET_REFERENCES "MyDll.dll" ) configure_file(MyDll.dll MyDll.dll COPYONLY) ``` 这将编译您的代码,并将 `MyDll.dll` 复制到可执行文件的目录中。 希望这可以帮助您开始在 C++调用 C# DLL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值