- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 C 语言项目,正在将其从 unix/linux 移植到 Windows/Cygwin (使用 autotools)。我需要调用一些winapi函数。这些函数需要包含一些 Windows header 。但是当我指定这些包含时,会引发由于重新定义某些结构或函数而引起的许多错误。
因此我决定创建一个静态库,其中将调用所有 winapi 函数以避免这些错误。但我在让它发挥作用时遇到了一些困难。
目前静态库仅包含一次 winapi 函数 GetAdaptersAddresses
调用,如下所示:
#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
void win_if_scan(void)
{
ULONG size = 10 * sizeof(IP_ADAPTER_ADDRESSES);
IP_ADAPTER_ADDRESSES *addresses = (IP_ADAPTER_ADDRESSES *)malloc(size);
GetAdaptersAddresses(AF_INET,
GAA_FLAG_INCLUDE_ALL_INTERFACES |
GAA_FLAG_INCLUDE_PREFIX |
GAA_FLAG_SKIP_DNS_SERVER,
NULL,
addresses,
&size);
}
我正在编译库libwin.a
,如下所示:
gcc libwin.c -liphlpapi -o libwin.o
ar crv libwin.a libwin.o
在项目中,我调用了 win_if_scan
函数(并且我包含了 libwin 的 header )。但我收到错误:对 WinMain 的 undefined reference
,完整消息是:
$ make > /dev/null
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../lib/libcygwin.a(libcmain.o): In function `main':
/usr/src/debug/cygwin-1.7.33-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain'
/usr/src/debug/cygwin-1.7.33-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: error: ld returned 1 exit status
make[1]: *** [libwin.o] Error 1
make: *** [all] Error 2
我不明白这里发生了什么。它是一个库,为什么需要main函数?当我尝试添加时:
int main(void) { return 0; }
或
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { return 0; }
它确实按照预期说了 main
的多个定义。
如何获得这项工作?或者是否有更好的方法来处理 cygwin 和 windows header 之间的重新定义错误?
最佳答案
第一步是仅从 libwin 生成目标文件,正如我在评论中提到的。其次,库 -liphlpapi
的规范必须位于项目链接在一起的位置,而不是生成目标文件的位置。这是有道理的,因为那里没有进行任何链接。因此,库存档是通过以下命令创建的:
gcc -c libwin.c -o libwin.o
ar crv libwin.a libwin.o
该项目是这样链接在一起的:
$(exedir)/bin: $(bin-dep)
$(CC) $(LDFLAGS) -o $@ $^ ../libwin/libwin.a $(LIBS) -liphlpapi
这是一个 Makefile 规则,您可以在其中看到我添加了 ../libwin/libwin.a
和 -liphlpapi
这仍然是一项正在进行的工作,很抱歉没有很好或系统的解决方案,但想法是存在的。
需要记住的重要一点是 Makefile 规则中 -liphlpapi
的位置,如前所述 a here
关于cygwin下调用winapi编译链接静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053351/
假设我有一个在 cygwin 下编译的应用程序,并且我想在不让用户安装 cygwin 的情况下分发该应用程序。打包可执行文件和 cygwin DLL 就足够了吗? 最佳答案 事情发生了变化。 Cygw
我从一个镜像站点下载了 cygwin,几个月后,当我尝试更新时,我收到一条消息:“当前 ini 文件来自较新版本的 setup-x86_64.exe” 如果我下载了新的 ini 文件,是否也意味着必须
有什么办法可以回去安装旧版本的 Cygwin? 说我想要 1.7.9 版本,但是 setup.exe在 Cygwin 网站上总是指向最新版本? 最佳答案 http://www.cygwin.com/s
我试图从我的C++代码运行这两个.data文件进行分配。我已经获得了所有文件,并且仅打算为程序实现一些功能(所有内容都应能够运行make命令进行编译)。 我曾经运行过MAC,只是刚开始使用Window
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
当我尝试对CVS管理的文件使用Emacs 23.2.1下的ediff-revision时,在*ediff-errors*框架中收到以下错误,而不是直接开始到ediff结果: cygwin warnin
我一直在用 Cygwin (许久)。具体来说,我在Win7上使用它(包括gcc/g++)进行开发工作。我最近才注意到现在存在一个 64-bit version . 我没有特定的需求要求我过渡到 64
我从安装程序 2.905 安装了 cygwin 3.1.7 64 位,如果我不使用 grep --color=always 我在终端中看不到彩色输出,即 grep - -color=auto 在我的终
如何使用 cygwin 挂载软盘镜像文件。我想挂载镜像,将文件复制到挂载的驱动器,然后从命令行卸载它。 我知道你可以使用 Virtual Floppy Drive在 Windows 中,但有没有办法在
这个question说明cygwin的软链接(soft link)和ntfs的junctions有些不同。我希望 cygwin 创建一个真正的连接点。我想过运行mklink但是,见鬼,没有mklink
我想设置一组最小的 cygwin 应用程序(ls、diff、path、find、grep),以便它们在没有完整 cygwin 安装的机器上运行。 我假设我需要的只是相关的 *.exe 文件和 *.dl
我的机器设置可以运行 cmake 和 gcc,我想在构建机器上安装具有完全相同的包和参数集的 cygwin,也可能在其他开发机器上。有没有一种方法可以做到这一点,而不必使用提供的 Setup.exe
我正在尝试使用 Cygwin 运行 Nutch。我在设置 JAVA_HOME 时遇到问题。 $ export JAVA_HOME='/cygdrive/f/program files/java/jd
如果您尝试“全局”安装 Composer,则它无法在 Cygwin 中正确运行。 将 composer.phar 放入/usr/local/bin/composer 中,然后尝试运行它会导致错误: C
要为 Cygwin 安装其他软件包,我是否只需要运行 setup.exe再次从包列表中选择? 此外,就安装 2 个 Cygwin 实例或此类问题而言,这样做不会损害我的计算机(我对这些事情有点菜鸟)。
我刚刚安装了 Cygwin,bash 提示符中的主目录看起来位于我的 Z: 驱动器上。这不是我想要的。 如何更改此设置? 最佳答案 Starting with Cygwin 1.7.34 ,建议的方法
cygwin 上的当前目录是 home/myuser。我导航到 cygwin,发现它有一个名为 home/myuser 的目录,我不知道如何导航到桌面。我不想在那里添加桌面目录,而且我无法在根文件夹
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我使用当前版本的 Cygwin,1.7.9-1。 当我输入“$ which python”时,Cygwin 输出“/usr/bin/python”。 为了确认根目录是我的 Windows 7 文件系统
我想在 Windows 中使用 cmd 做类似的事情: start dir c:\ 应打开一个新控制台,并显示 dir c: 的输出。 对于 Cygwin 我尝试了这个: cmd /c start b
我是一名优秀的程序员,十分优秀!