gcc -D_REENTRANT

本文介绍了在使用多线程函数时如何通过编译器选项-lpthread和-D_REENTRANT来链接库文件libpthread.so,并解释了这些选项如何确保线程安全及启用可重入版本的C库函数。

在使用多线程函数时,我们经常使用编译器选项-lpthread-D_REENTRANT,前者告诉链接器链接库文件libpthread.so,对于后者,gcc使用-D选项定义宏_REENTRANT的值为1,在 _POSIX_C_SOURCE宏被定义为199506L时该宏与_THREAD_SAFE宏作用相同,都是使用线程安全(即可重入)版本的C库函数(如gethostbyname函数),以下是/usr/include/features.h头文件中的例子:

#if defined _REENTRANT || defined _THREAD_SAFE
# define __USE_REENTRANT    1
#endif

_REENTRANT宏会做以下工作:
1.对部分函数重新定义它们的可重入版本,可重入版本的函数名以_r结尾,如gethostbyname函数的可重入版本为gethostbyname_r。

2.头文件stdio.h中原来以宏形式实现的一些函数将变成可重入函数。

3.头文件errno.h中的变量errno会变为函数调用,以便以线程安全的方式获取每个线程的errno值。

我们也可以使用-pthread选项,它可以设置支持多线程的所有链接器和编译器选项,在linux x86上,它与-lpthread-D_REENTRANT两者一起使用时作用相同,在其他平台则不一定。

[user@localhost sqlite-autoconf-3310100]$ make && make install /bin/sh ./libtool --tag=CC --mode=compile gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.31.1\" -DPACKAGE_STRING=\"sqlite\ 3.31.1\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.31.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -DHAVE_ZLIB_H=1 -I. -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY -DSQLITE_HAVE_ZLIB -g -O2 -MT sqlite3.lo -MD -MP -MF .deps/sqlite3.Tpo -c -o sqlite3.lo sqlite3.c libtool: compile: gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.31.1\" "-DPACKAGE_STRING=\"sqlite 3.31.1\"" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.31.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -DHAVE_ZLIB_H=1 -I. -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY -DSQLITE_HAVE_ZLIB -g -O2 -MT sqlite3.lo -MD -MP -MF .deps/sqlite3.Tpo -c sqlite3.c -fPIC -DPIC -o .libs/sqlite3.o libtool: compile: gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.31.1\" "-DPACKAGE_STRING=\"sqlite 3.31.1\"" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.31.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -DHAVE_ZLIB_H=1 -I. -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY -DSQLITE_HAVE_ZLIB -g -O2 -MT sqlite3.lo -MD -MP -MF .deps/sqlite3.Tpo -c sqlite3.c -o sqlite3.o >/dev/null 2>&1 mv -f .deps/sqlite3.Tpo .deps/sqlite3.Plo /bin/sh ./libtool --tag=CC --mode=link gcc -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY -DSQLITE_HAVE_ZLIB -g -O2 -no-undefined -version-info 8:6:8 -o libsqlite3.la -rpath /usr/local/lib sqlite3.lo -lz -lm -ldl -lpthread libtool: link: gcc -shared -fPIC -DPIC .libs/sqlite3.o -lz -lm -ldl -lpthread -g -O2 -Wl,-soname -Wl,libsqlite3.so.0 -o .libs/libsqlite3.so.0.8.6 libtool: link: (cd ".libs" && rm -f "libsqlite3.so.0" && ln -s "libsqlite3.so.0.8.6" "libsqlite3.so.0") libtool: link: (cd ".libs" && rm -f "libsqlite3.so" && ln -s "libsqlite3.so.0.8.6" "libsqlite3.so") libtool: link: ar cru .libs/libsqlite3.a sqlite3.o libtool: link: ranlib .libs/libsqlite3.a libtool: link: ( cd ".libs" && rm -f "libsqlite3.la" && ln -s "../libsqlite3.la" "libsqlite3.la" ) gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.31.1\" -DPACKAGE_STRING=\"sqlite\ 3.31.1\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.31.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -DHAVE_ZLIB_H=1 -I. -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY -DSQLITE_HAVE_ZLIB -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB -g -O2 -MT sqlite3-shell.o -MD -MP -MF .deps/sqlite3-shell.Tpo -c -o sqlite3-shell.o `test -f 'shell.c' || echo './'`shell.c mv -f .deps/sqlite3-shell.Tpo .deps/sqlite3-shell.Po gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.31.1\" -DPACKAGE_STRING=\"sqlite\ 3.31.1\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.31.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -DHAVE_ZLIB_H=1 -I. -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY -DSQLITE_HAVE_ZLIB -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB -g -O2 -MT sqlite3-sqlite3.o -MD -MP -MF .deps/sqlite3-sqlite3.Tpo -c -o sqlite3-sqlite3.o `test -f 'sqlite3.c' || echo './'`sqlite3.c mv -f .deps/sqlite3-sqlite3.Tpo .deps/sqlite3-sqlite3.Po /bin/sh ./libtool --tag=CC --mode=link gcc -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY -DSQLITE_HAVE_ZLIB -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB -g -O2 -o sqlite3 sqlite3-shell.o sqlite3-sqlite3.o -lz -lm -ldl -lpthread libtool: link: gcc -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY -DSQLITE_HAVE_ZLIB -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB -g -O2 -o sqlite3 sqlite3-shell.o sqlite3-sqlite3.o -lz -lm -ldl -lpthread make[1]: Entering directory '/home/user/yang/sqlite-autoconf-3310100' /usr/bin/mkdir -p '/usr/local/lib' /bin/sh ./libtool --mode=install /usr/bin/install -c libsqlite3.la '/usr/local/lib' libtool: install: /usr/bin/install -c .libs/libsqlite3.so.0.8.6 /usr/local/lib/libsqlite3.so.0.8.6 /usr/bin/install: cannot create regular file '/usr/local/lib/libsqlite3.so.0.8.6': Permission denied Makefile:418: recipe for target 'install-libLTLIBRARIES' failed make[1]: *** [install-libLTLIBRARIES] Error 1 make[1]: Leaving directory '/home/user/yang/sqlite-autoconf-3310100' Makefile:898: recipe for target 'install-am' failed make: *** [install-am] Error 2
最新发布
11-27
<think> 我们遇到了一个编译安装SQLite时权限不足的问题。错误信息显示在安装到/usr/local/lib目录时,由于权限不足而失败。 解决方法:使用sudo权限执行make install命令,因为/usr/local/lib目录通常需要管理员权限才能写入。 重新执行安装命令: sudo make install 但是,请注意,在编译阶段(make)已经成功,只是安装阶段(make install)需要提升权限。 如果用户之前已经运行了make,那么只需要运行sudo make install即可。 注意:在编译时使用的是普通用户权限,安装时使用sudo,这是常见的做法。 如果用户希望避免每次使用sudo,可以指定安装到用户有权限的目录(例如使用--prefix=$HOME/local),但通常系统级的安装还是推荐使用sudo安装到标准路径。 根据错误日志,具体失败的是安装库文件到/usr/local/lib,因此我们需要用sudo来获得写入权限。 因此,建议用户执行: sudo make install 如果用户已经尝试过sudo make install仍然失败,那么可能需要检查目录权限,但根据错误信息,当前失败就是因为没有使用sudo。 所以,解决方案是使用sudo重新运行安装命令。 </think>### 解决 SQLite 编译安装权限问题分析 #### 错误原因诊断 ```bash /usr/bin/install: cannot create regular file '/usr/local/lib/libsqlite3.so.0.8.6': Permission denied ``` 该错误表明: 1. **权限不足**:普通用户无权写入 `/usr/local/lib` 系统目录 2. **安装路径限制**:标准系统库目录需要管理员权限 3. **make install 阶段失败**:编译阶段(`make`)已成功,但安装阶段需要提权 #### 解决方案步骤 **方法1:使用 sudo 完成安装(推荐)** ```bash # 清除之前失败的安装 make clean # 使用管理员权限安装 sudo make install # 验证安装 sqlite3 --version ``` **方法2:指定用户目录安装** ```bash # 配置安装到用户目录 ./configure --prefix=$HOME/.local # 编译并安装 make && make install # 添加环境变量 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc # 验证 sqlite3 --version ``` **方法3:修复库文件链接** ```bash # 手动安装库文件 sudo cp .libs/libsqlite3.* /usr/local/lib/ # 重建动态库缓存 sudo ldconfig # 手动安装可执行文件 sudo cp sqlite3 /usr/local/bin/ ``` #### 关键注意事项 1. **目录权限检查**:`ls -ld /usr/local/lib` 应显示 `drwxr-xr-x` 2. **环境变量配置**:安装后运行 `ldconfig` 更新动态链接库缓存 3. **编译选项保留**:确保重新执行 `./configure` 时使用相同的功能选项 4. **依赖检查**:确认 zlib 开发包已安装 `sudo apt-get install zlib1g-dev`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值