C语言包装C++对外提供接口(使用CMake工具)

CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
cmake_minimum_required(VERSION 3.13)

#项目名称
project(cwrapcpp)
#要放到这个位置,表示之后添加的源文件,都是用utf8编码
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_library(cwrapcpp SHARED  wrap1.cpp)
#
find_package(Qt5 COMPONENTS Widgets Core Gui Charts HINTS "D:\\Qt\\Qt5.9.7\\5.9.7\\msvc2017_64\\lib\\cmake")
#
include(GenerateExportHeader)
generate_export_header(cwrapcpp PREFIX_NAME C_)
#
target_compile_definitions(cwrapcpp PRIVATE cwrapcpp_EXPORTS)
target_include_directories(cwrapcpp PRIVATE ${CMAKE_BINARY_DIR})
target_link_libraries(cwrapcpp PRIVATE Qt5::Widgets Qt5::Gui Qt5::Core Qt5::Charts)

# set_property(SOURCE wrap1.cppsry PROPERTY LANGUAGE CXX)
#
install(TARGETS cwrapcpp DESTINATION ${CMAKE_BINARY_DIR}/install)
install(FILES ${CMAKE_BINARY_DIR}/cwrapcpp_export.h wrap.h  DESTINATION ${CMAKE_BINARY_DIR}/install)

cwrapcpp_export.h(CMake自动生成)


#ifndef C_CWRAPCPP_EXPORT_H
#define C_CWRAPCPP_EXPORT_H

#ifdef C_CWRAPCPP_STATIC_DEFINE
#  define C_CWRAPCPP_EXPORT
#  define C_CWRAPCPP_NO_EXPORT
#else
#  ifndef C_CWRAPCPP_EXPORT
#    ifdef cwrapcpp_EXPORTS
        /* We are building this library */
#      define C_CWRAPCPP_EXPORT __declspec(dllexport)
#    else
        /* We are using this library */
#      define C_CWRAPCPP_EXPORT __declspec(dllimport)
#    endif
#  endif

#  ifndef C_CWRAPCPP_NO_EXPORT
#    define C_CWRAPCPP_NO_EXPORT 
#  endif
#endif

#ifndef C_CWRAPCPP_DEPRECATED
#  define C_CWRAPCPP_DEPRECATED __declspec(deprecated)
#endif

#ifndef C_CWRAPCPP_DEPRECATED_EXPORT
#  define C_CWRAPCPP_DEPRECATED_EXPORT C_CWRAPCPP_EXPORT C_CWRAPCPP_DEPRECATED
#endif

#ifndef C_CWRAPCPP_DEPRECATED_NO_EXPORT
#  define C_CWRAPCPP_DEPRECATED_NO_EXPORT C_CWRAPCPP_NO_EXPORT C_CWRAPCPP_DEPRECATED
#endif

#if 0 /* DEFINE_NO_DEPRECATED */
#  ifndef C_CWRAPCPP_NO_DEPRECATED
#    define C_CWRAPCPP_NO_DEPRECATED
#  endif
#endif

#endif /* C_CWRAPCPP_EXPORT_H */

wrap.h

#ifndef __WRAP_H__
#define __WRAP_H__

#include "cwrapcpp_export.h"
//错误写法
//#define extern "C" {
#ifdef __cplusplus
extern "C" {
#endif
 C_CWRAPCPP_EXPORT  void qplot(int);
 C_CWRAPCPP_EXPORT  void qplotstr(char*);

#ifdef __cplusplus
}
#endif

#endif

wrap1.cpp

#include "wrap1.h"
#include <iostream>
#include "wrap.h"
#include <QApplication>
#include <QWidget>
#include <QLabel>

//构造函数
Ca::Ca(int a){
    std::cout<<"Ca get a num"<<a<<"\n";
}

//
void qplot(int v){
    int argc = 0;
    char *argv[]={nullptr};
    QApplication app(argc,argv);
    QWidget widget;
    Ca a(v);
    widget.show();
    app.exec();
}


//
void qplotstr(char* v){
    std::cout<<"in qplotstr get "<<v<<std::endl;    
}

wrap1.h

#pragma once
class Ca{
    public:
    Ca(int);
};
posted @ 2021-09-08 18:48  iwetuan  阅读(178)  评论(0编辑  收藏  举报