首先我知道这被问了一千次。但我打开了一些,每个人都忘了编译/链接它。 无论如何,我在带有标题和文件的单独文件中创建了一个链接列表,它工作正常,但是我尝试向它添加一个新函数,但后来我对'function'进行了未定义的引用。这是来源:
list.c
#include "list.h"
struct node
{
item_t x;
struct node *next;
};
struct node* root;
//Window hider extension
void ToggleVisibleList(HWND currentHwnd)
{
if (root == 0)
return;
struct node *conductor = root;
while (conductor != 0)
{
HWND hwnd = (HWND)conductor->x;
ShowWindow(hwnd, IsWindowVisible(hwnd) ? SW_HIDE : SW_SHOW);
conductor = conductor->next;
}
ShowWindow(currentHwnd, IsWindowVisible(currentHwnd) ? SW_HIDE : SW_SHOW);
}
//...Rest of the file
list.h
#ifndef LIST_H
#define LIST_H
#include <stdlib.h>
#include <windows.h>
//Window hider extension
void ToggleVisibleList(HWND currentHwnd);
//.. rest of the header
的main.c
#include <windows.h>
#include <stdio.h>
#include <commctrl.h>
#include "list.h"
HWND currentHwnd;
//..
HHOOK hookKeyboard;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
if (wParam == WM_KEYDOWN)
{
KBDLLHOOKSTRUCT* hookStruct = (KBDLLHOOKSTRUCT*)lParam;
if (hookStruct->vkCode == 'Z' && GetAsyncKeyState(VK_LCONTROL))
{
ToggleVisibleList(currentHwnd);
}
}
}
CallNextHookEx(hookKeyboard, nCode, wParam, lParam);
}
//..Rest of file
我使用Mingw编译(操作系统:Windows 8 64位):
gcc -o hider.exe main.c list.c -mwindows
C:\Users\...\AppData\Local\Temp\cc6sCa17.o:main.c:(.text+0x4bc): undefined reference to `ToggleVisibleList'
collect2: ld gaf exit-status 1 terug
//Translation: ld return exit-status 1
编辑:尝试交换文件顺序。
我希望我没有重复一个问题,我不这么认为,因为我先尝试了20个问题。 (还有谷歌。) 此致
答案:重新启动计算机并进行编译。
答案 0 :(得分:0)
黑暗答案中的总镜头:
我怀疑可能有效(在编译顺序中交换list.c和main.c)
gcc -o hider.exe list.c main.c -mwindows
我建议这样做,因为与库的链接与gcc具有相似的行为。但我从未在文件顺序中发现过这个问题。
来自gcc手册页(关于 -l library )
在您编写此选项的命令中,它会有所不同;该 链接器搜索和进程 库和目标文件按指定顺序排列。因此,foo.o -lz bar.o搜索库 z在文件foo.o之后但在bar.o之前如果bar.o引用z中的函数,则这些函数可能不是 加载。