1

我今天开始试验 MySQL C API,我今天在我的 10.6.8 macbook 上从源代码编译它,并推出了一个快速的 makefile + 应用程序框架。不过,我觉得有点生疏,因为我似乎无法让它正确链接(现在看来是固定的)或动态加载库(问题如下所述)。

我收到的确切错误如下:

$ make clean && make
gcc -L/usr/local/mysql/lib -I/usr/local/mysql/include -lmysql -lpthread -ggdb -Wall -o adapter main.c adapter.c 

$ ./adapter
dyld: Library not loaded: libmysql.16.dylib
  Referenced from: /tmp/./adapter
  Reason: image not found
Trace/BPT trap

我环顾四周,出现了很多关于 an 的结果install_name_tool。但是,在阅读了其中的一些之后,我仍然不完全了解这实际上是做什么的。有很多关于框架的讨论,这并不真正适合我参与这样一个简单项目的期望。

无论如何,这是我的代码(包括makefile)。

主.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "adapter.h"

int main (int argc, char *argv[]) {
    printf("Version: %s\n", get_version());
    return 0;
}

适配器.c

#include <mysql.h>

char *get_version () {
    return (char *)mysql_get_client_info();
}

适配器.h

char *get_version ();

生成文件

CC = gcc
MYSQL_FLAGS = -L/usr/local/mysql/lib -I/usr/local/mysql/include -lmysql -lpthread
CFLAGS = -ggdb -Wall
OBJS = 

adapter: $(OBJS)
    $(CC) $(MYSQL_FLAGS) $(CFLAGS) -o adapter main.c adapter.c $(OBJS)

clean:
    @rm -f *~ *.o adapter
    @rm -rf *.dSYM

而且,附带说明,这些文件确实存在:

$ ls /usr/local/mysql/lib
libmysql.16.0.0.dylib   libmysql.dylib      libmysqlclient.dylib
libmysql.16.dylib       libmysqlclient.a    libmysqlclient_r.dylib

$ ls /usr/local/mysql/include
atomic          my_atomic.h     my_md5.h        myisampack.h        sslopt-case.h
base64.h        my_attribute.h  my_net.h        mysql.h             sslopt-longopts.h
config-win.h    my_base.h       my_no_pthread.h mysql_com.h         sslopt-vars.h
decimal.h       my_bit.h        my_nosys.h      mysql_time.h        t_ctype.h
errmsg.h        my_bitmap.h     my_pthread.h    mysql_version.h     thr_alarm.h
hash.h          my_charsets.h   my_stacktrace.h mysqld_error.h      thr_lock.h
keycache.h      my_config.h     my_sys.h        mysys               typelib.h
lf.h            my_dbug.h       my_time.h       mysys_err.h         violite.h
m_ctype.h       my_dir.h        my_tree.h       queues.h            waiting_threads.h
m_string.h      my_getopt.h     my_trie.h       service_versions.h  wqueue.h
my_aes.h        my_global.h     my_uctype.h     sha1.h
my_alarm.h      my_libwrap.h    my_vle.h        sha2.h
my_alloc.h      my_list.h       my_xml.h        sql_common.h

我有一种直觉,我的 Makefile 有问题,或者这是 Mac OS X 特有的问题,但实际上,我真的不确定问题是什么。

4

1 回答 1

4

这是一个动态链接器错误,与源代码无关。有很多方法可以修复它。最简单的也许是/usr/local/mysql/libDYLD_LIBRARY_PATH运行之前添加adapter。例如:

$ export DYLD_LIBRARY_PATH="${DYLD_LIBRARY_PATH}:/usr/local/mysql/lib"
$ ./adapter
于 2012-10-09T20:57:21.367 回答