此问题在此处已有答案:
Why does the order in which libraries are linked sometimes cause errors in GCC?(9个回答)
上个月关门了。
我创建了一个库,其中包含一个使用外部库的函数。当我尝试构建测试应用程序时,包括所有库,我得到了undefined reference error to PlaySoundA@12
。我的发展中有什么是假的?
以下是我所做的:
第一步- * 带外部引用函数概述 *
这是audio_functions. c文件
#include <windows.h>
#include <Mmsystem.h> //For PlaySound() - Winmm.lib is library
#include "audio_functions.h"
uint8_t play_sound(const char *path)
{
int psret;
psret = PlaySound(path, NULL, SND_ASYNC | SND_FILENAME | SND_NODEFAULT | SND_NOSTOP);
if(psret) { return 1; }
else { return 0; }
}
字符串
这只是一个简单的函数,用于测试外部引用的情况。
第二步- * 创建库 *
我使用.bat文件创建库
set pname=_ERZ_LIBRARY
set location=C:\MinGW\bin\proj\%pname%
//Creating .o files
//only in audio_functions is an external referance, the other functions works
gcc -c -pedantic %location%\audio_functions\*.c -o %location%\_AR\audio_functions.o
... more files
cd %location%\_AR\
//Use ar.exe to create archiv from all .o files where created
ar -rcs %location%\BUILD\ERZ_LIBRARY.lib *.o
//Take a look to all functions in library
nm --print-armap %location%\BUILD\ERZ_LIBRARY.lib
型
函数已存档,输出如下:
audio_functions.o:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T _play_sound
U _PlaySoundA@12
型
第三步- * 使用库 *
下面显示了test_erz_library. c(使用创建的静态库)
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
#include <mmsystem.h>
#include "C:/MinGW/bin/proj/_ERZ_LIBRARY/ERZ_LIBRARY.h"
int main()
{
output(blue, NULL, "TEST -- [Version %s]", "1.0.0"); //function from ERZ_LIBRARY that works
get_version(1); //function from ERZ_LIBRARY that works
play_sound("C:\\MinGW\\bin\\proj\\test_erz_library\\Aramam.wav"); //function from ERZ_LIBRARY that do not work and printing the undefined reference error
}
型
接下来展示了我如何使用编译器(.bat文件):
set val=test_erz_library
set pname=test_erz_library
gcc C:\MinGW\bin\proj\%pname%\%val%.c -lWinmm -LC:\MinGW\bin\proj\_ERZ_LIBRARY\BUILD -l:ERZ_LIBRARY.lib -o C:\MinGW\bin\proj\%pname%\%val%.exe
C:\MinGW\bin\proj\%pname%\%val%.exe
型
没有我的play_sound
函数,我的库中的所有函数都可以工作。当我使用play_sound
时,所描述的错误将生成..
1条答案
按热度按时间iyr7buue1#
解决方案
在发布之前,我找到了一个解决方案。时间顺序是我的问题。当我这样编译时
字符串
所有参考文献均在此处找到。这有点令人困惑,但我希望我的解决方案能帮助有同样问题的人。