首页 > 编程语言 >C++ 交叉编译技巧

C++ 交叉编译技巧

时间:2023-02-03 23:55:33浏览次数:47  
标签:__ 交叉 defined WIN64 C++ dll WIN32 编译

本文是借鉴的有关C相关的文章,由于C与C++有部分相似,此处用C距离,还没有验证过

  用 C 语言写一个小程序,在设计时希望该程序在 Windows、Linux平台上都能够运行,所以使用宏来区分在不同操作系统下执行的语句。比如这个程序需要根据不同平台加载不同的动态链接库,在包含头文件时,写法如下:

#if defined(_WIN32) || defined(_WIN64)
  #include <windows.h>
#else
  #include <dlfcn.h>  /* unix 或 linux 下包含与动态库加载、卸载有关函数的头文件名是 dlfcn.h */
#endif

加载动态链接库时,处理方法如下:

#if defined(_WIN32) || defined(_WIN64)
  HINSTANCE dll_handle_for_win;
/* 当操作系统为 windows 类型时,使用函数 LoadLibrary() 加载动态链接库 */
#else
  void *dll_handle_for_unix_or_linux;
  char *error_statement;
/* 当操作系统为 unix 或 linux 类型时,使用函数 dlopen() 加载动态链接库 */
#endif
 
  int error_code;
  char dll_file_name[256];  /* dll_file_name 是要加载的动态链接库文件名 */
 
/*********************************
  注意:这里省略了部分内容
**********************************/
 
/**************************************/
// Load dynamic library
#if defined(_WIN32) || defined(_WIN64)
  if ( !(dll_handle_for_win = LoadLibrary(dll_file_name)) )
  {
#ifdef _DEBUG
    printf("load dynamic link library \'%s\' failed at %s, line %d!\n", dll_file_name, __FILE__, __LINE__);
    error_code = GetLastError();
    printf("LoadLibrary() function returned error code: 0x%x\n", error_code);
#endif
    return (-1);
  }
/**************************************/
#else
  dlerror();
  if ( !(dll_handle_for_unix_or_linux = dlopen(dll_file_name, RTLD_LAZY)) )
  {
    error_statement = dlerror();
#ifdef _DEBUG
    printf("load dynamic link library \'%s\' failed at %s, line %d!\n", dll_file_name, __FILE__, __LINE__);
    printf("Error statement: %s\n", error_statement);
#endif
    return (-1);
  }
#endif

释放动态链接库时,处理方法如下:

#if defined(_WIN32) || defined(_WIN64)
  FreeLibrary(dll_handle_for_win);
#else
  dlclose(dll_handle_for_unix_or_linux);
#endif

  

  在 64 位 Win7 下,用 Visual Studio 2010 编译、链接,能够生成可执行程序,程序能正常运行。接下来想知道在 Linux 下该程序能否编译,希望在 Windows 平台上先排除一下像拼写一类的小错误,可是手头暂时没有安装Linux 的计算机,这样就需要在 Windows 平台上用 GCC 编译一下这个程序,做法如下:
  编译 C 程序。由于当前阶段只想编译程序,不需要链接。进入命令提示符窗口,到程序所在目录下,执行gcc的命令,格式:gcc -c 源代码.c -I 头文件所在路径
  比如可以是:gcc -c test.c -I C:\testcode\include
  结果显示一大堆错误和警告。编译报错的程序语句都处于 _WIN32 或 _WIN64 宏定义中包含的部分。由于我此时的目的并不是要用 GCC 生成 Windows 下的可执行程序,而是想让 GCC 编译一下程序中能够在 Linux 平台上执行的那部分语句,检查那部分语句中是否存在语法等错误,但是现在 GCC 编译的还是在 Windows 平台上能执行的语句。为什么会这样?需要查看一下 GCC 编译时默认已定义了哪些宏。在网上查到查看 GCC 编译时默认宏的命令是:gcc -dM -E - < /dev/null

img

  果然安装的 gcc 中,已经默认定义了 _WIN32 宏。在编译 C 程序时,想取消对 _WIN32 及 _WIN64 宏的定义,并且默认已定义的宏中没有包含 _DEBUG,在编译调试版程序时需要用到这个宏,就可以使用这个命令:
gcc -c test.c -I C:\testcode\include -U_WIN32 -U_WIN64 -D_DEBUG
gcc 编译选项说明:
-c 只编译,不链接
-D 使用指定的宏
-U 取消指定的宏

  用 GCC 编译时发现不再报告处于 _WIN32 或 _WIN64 宏定义中包含的语句错误了。接下来根据编译结果给出的提示,修改了一些拼写错误,成功生成了 test.o 文件,证明该 C 程序能够在 Linux 下通过编译。等将来有空时安装 Linux 虚拟机,再将 C 程序及其调用的动态库源程序都拿到 Linux 上编译链接,就能生成 Linux 上的可执行程序了。

标签:__,交叉,defined,WIN64,C++,dll,WIN32,编译
From: https://www.cnblogs.com/hhddd-1024/p/17090726.html

相关文章

  • C/C++ 实现循环队列
    #include<iostream>#include<Windows.h>usingnamespacestd;#defineMAXSIZE6typedefintQElemType;typedefstruct{QElemType*base;//基地址intr......
  • C++ 宏
    目录标识符_与__的含义C++内置宏定义1.标准内置宏定义2.公共内置宏定义2.1查看GCC所有内置宏定义2.2查看G++所有内置宏定义3.系统内置宏定义4.内置操作符宏......
  • c++虚拟内存
    可以通过调用vmemalloc类型对象的括号运算符(len,name)分配大小为len,文件名为name的虚拟内存。返回首地址的迭代器。无需delete,程序结束后会自动清空文件,但是保留文件名#......
  • 代码随想录-数组-C++总结
    1.二分查找重点区分左闭右开,左闭右闭两种写法中的差异,理解循环中的不变量,这样在returnr还是l和什么时候l+1r-1什么时候不需要+1-1很重要。35.搜索插入位置-力扣(Leet......
  • C++ 1398:短信计费
    1398:短信计费【题目描述】用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条......
  • C++1155:回文三位数
    1155:回文三位数【题目描述】如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如6886就是一个回文数,求出所有的既是回文数又是素数的三位数。【输入】(......
  • Matlab编译生成DLL,供QT调用
    QT5.15.2MatlabR2022a一、使用matlab生成dll准备好matlab接口命令行窗口敲入以下命令:  弹出以下对话框 选择LibraryCompiler弹出以下对话框  选择C......
  • C++开发面试题合集
    1.epoll的工作原理(【360实习】C++开发)epoll是一种I/O事件通知机制,是linux内核实现IO多路复用的一个实现。在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出......
  • C++ 哈希表查询_进入哈希函数结界的世界
    1.前言哈希表或称为散列表,是一种常见的、使用频率非常高的数据存储方案。哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行API定制,对于大部分高级语言......
  • C++第四章类与对象
    一、面向对象的基本特点1.  抽象对同一类对象的共同属性和行为进行概括,形成类。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互......