我在Eclipse中有一个静态库项目,它被编译成.a文件.那么现在我将如何使用该库中的函数和常量?我会加入我的包括:
#include "mylib.a"
Run Code Online (Sandbox Code Playgroud) 我创建了一个C++类,我将它放在自己的静态库中.
我还决定创建一个最小的头文件,允许其他人看到public:该类的一部分.所以我基本上采用了原始的头文件(相当长,包含类private:和public:部分类等),并删除除了public:部分之外的所有内容(简短,只有构造函数/析构函数和一个公共函数).
为了测试我已经创建了一个使用该库的虚拟项目.问题是,每当我在该项目中使用最小头文件时,它就会崩溃,例如:
test(44349) malloc: *** error for object 0x7fdab2c242e8: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
但每当我包含原始头文件时,它都可以正常工作.
可能是什么问题呢?它-Wall使用最小和原始头文件编译好(即使没有警告).
我记得,几年前当我开始使用mySQL时,设置"就是这样"是一件噩梦,以便找到库(特别是mySQL库!).就我而言,我相信ldconfig是解决问题的工具.闪存到2012年 - 刚刚安装了一个包含64位Ubuntu 12.04的新"主"系统,我正在确保所有源代码都能编译.想象一下,我很惊讶我和libmysqlclient一起回到同一条船上.
我的网络搜索显示了很多尝试,没有任何帮助.一路走来,我发现了这个诀窍:gcc ...... mysql_config --cflags --libs- 非常好,但是没有用.
因此,例如,结果:
gcc -D_FILE_OFFSET_BITS=64 `mysql_config --cflags --libs` \
-o check-my-ip \
-s check-my-ip.c ../common/ini-file.c
Run Code Online (Sandbox Code Playgroud)
是
/tmp/ccxAgCqr.o: In function `updateTables':
/usr/local/src/check-my-ip/check-my-ip.c:373: undefined reference to `mysql_init'
/usr/local/src/check-my-ip/check-my-ip.c:374: undefined reference to `mysql_real_connect'
/usr/local/src/check-my-ip/check-my-ip.c:381: undefined reference to `mysql_error'
/usr/local/src/check-my-ip/check-my-ip.c:381: undefined reference to `mysql_errno'
/usr/local/src/check-my-ip/check-my-ip.c:397: undefined reference to `mysql_field_count'
/usr/local/src/check-my-ip/check-my-ip.c:398: undefined reference to `mysql_use_result'
/usr/local/src/check-my-ip/check-my-ip.c:399: undefined reference to `mysql_fetch_row'
/usr/local/src/check-my-ip/check-my-ip.c:419: undefined reference to `mysql_free_result'
/usr/local/src/check-my-ip/check-my-ip.c:422: undefined reference to `mysql_field_count'
/usr/local/src/check-my-ip/check-my-ip.c:429: undefined reference to `mysql_close'
/tmp/ccxAgCqr.o: …Run Code Online (Sandbox Code Playgroud) 该库提供了一个派生类,派生类作为模板参数.
例:
class userclass : public lib::superclass<userclass>
{}
Run Code Online (Sandbox Code Playgroud)
你可以看到很多东西要打字.并且"userclass"应该始终公开,以使其正常工作.所以我提出了两个看起来像这样的MACRO:
#define SUPER(x) public lib::superclass<x>
#define SUPERCLASS(x) class x : public lib::superclass<x>
Run Code Online (Sandbox Code Playgroud)
用户现在可以键入任何一个.
class userclass : SUPER(userclass)
{}
SUPERCLASS(userclass)
{}
Run Code Online (Sandbox Code Playgroud)
但主要问题是,MACER SUPER和SUPERCLASS存在于用户全局命名空间中,与包含的标题一样快.
可以/我应该:
我正在使用vs 11,该库是针对Windows开发人员的.
我创建了两个库libsa.a和libsb.a.该功能FuncA的在libsa.a和funcb在libsb.a这就要求FuncA的.
在main函数中,我只调用funcb.编译器显示"...未定义引用` funca '".编译器命令如"gcc main.c -o main -lsa -lsb".
当我在main函数中添加funca时,问题得以解决.
我能做什么?
抱歉我的英语不好!
所以我有一个.o文件目录,我试图使用libtool输出到静态库.
从包含所有.o文件的目录中,我执行以下操作,其中mylibrary.a位于父目录中
$ libtool -static *.o -output ../mylibrary.a
Run Code Online (Sandbox Code Playgroud)
但是我一直收到以下错误:
unknown option character `o' in: -output
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我在mac osx终端上做这一切
我构建了一个静态库.问题是我无法从我的Makefile链接它
TARGET = AR1020
CC = gcc
CFLAGS = -Wall -std=c99 -I./inc/
LINKER = gcc -o
LFLAGS = -Wall -static -I./inc/
SRCDIR = src
INCDIR = inc
OBJDIR = obj
BINDIR = bin
LIBDIR = ./lib
LIBFLAG = -li2c
SOURCES := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(INCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm = rm -f
$(BINDIR)/$(TARGET): $(OBJECTS)
@$(LINKER) $@ $(LFLAGS) -L$(LIBDIR) $(LIBFLAG) $(OBJECTS)
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully"
.PHONY: …Run Code Online (Sandbox Code Playgroud) 当我尝试使用静态库编译程序时,我遇到了问题.我创建了我的.c文件的目标文件gcc -c ft_putstr.c.然后我执行ar -rcs libft.a ft_putstr.o,然后我做gcc main.c -L. -lft,我
警告:函数'ft_putstr'的隐式声明在C99中无效.
二进制文件已创建但我不想要这个警告,即使它是这样的.如果我-std="c89"在GCC上有旗帜但我使用C99就可以了.
这是我的主要内容:
int main(void)
{
ft_putstr("Bonjour");
return (0);
}
Run Code Online (Sandbox Code Playgroud)
这是我的ft_putstr.c:
#include <unistd.h>
void ft_putstr(char *str)
{
(*str) ? write(1, str, 1), ft_putstr(str + 1) : 0;
}
Run Code Online (Sandbox Code Playgroud) 除了包含第三方软件之外,为什么要为项目创建静态库.如果您自己编写源代码,那么您可以将其构建为项目的一部分,如果它是一个不止一次使用的库,那么动态链接和坐在运行时库上会不会更有意义?
我需要能够在我的主应用程序中的静态库中的函数和我的重写版本之间切换.为此,我正在尝试使用函数指针.问题是我不知道如何将静态库加载到我的程序中.这可能吗?或者我必须使用DLL?