C静态库与外部库一起使用函数[重复]

bvk5enib  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(66)

此问题在此处已有答案

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时,所描述的错误将生成..

iyr7buue

iyr7buue1#

解决方案

在发布之前,我找到了一个解决方案。时间顺序是我的问题。当我这样编译时

gcc C:\MinGW\bin\proj\%pname%\%val%.c -LC:\MinGW\bin\proj\_ERZ_LIBRARY\BUILD -l:ERZ_LIBRARY.lib -lWinmm -o C:\MinGW\bin\proj\%pname%\%val%.exe

字符串
所有参考文献均在此处找到。这有点令人困惑,但我希望我的解决方案能帮助有同样问题的人。

相关问题