32位嵌入式处理器编程:warning: integer constant is too large for 'long' type

在使用EDK进行软件应用开发时,若定义longlonginteger类型变量出现编译警告,解释原因并提供解决方法:此警告是因为gcc语法严格要求在长整型常量末尾添加LL。通过在常量后添加LL即可消除警告,不影响64位计算的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

疑问描述

Keywords: EDK, long long integer, 64-bit, SW, mb-gcc, powerpc-eabi-gcc, compiler, C/C++ , g++

When I define a long long integer data type in SW application in EDK, a warning / error similar to the following occurs:

"warning: integer constant is too large for 'long' type".

Example:
int main ()
{
long long int test = 0x0008888000000000;
},

解决方案
The warning message can be safely ignored, as mb-gcc is not doing anything wrong; the 64-bit computing is in fact correct.

This warning occurs because gcc is strict in syntax and requires LL on the end of such constants. This warning message disappears if the integer is appended with LL.

long long int test = 0x0008888000000000LL;
root@ubuntu:/home/t101/paho.mqtt.c-master# make mkdir -p build/output/samples mkdir -p build/output/test echo OSTYPE is Linux OSTYPE is Linux sed -e "s/@CLIENT_VERSION@/1.3.0/g" -e "s/@BUILD_TIMESTAMP@/Thu Jun 19 06:23:05 PDT 2025/g" src/VersionInfo.h.in > build/VersionInfo.h arm-linux-gcc -g -fPIC -I/home/t101/sysdir/ssl/include/ -Os -Wall -Ibuild -o build/output/libpaho-mqtt3c.so.1.0 src/Heap.c src/Socket.c src/MQTTProtocolClient.c src/MQTTProtocolOut.c src/SHA1.c src/StackTrace.c src/MQTTProperties.c src/MQTTPersistenceDefault.c src/MQTTPacketOut.c src/WebSocket.c src/Clients.c src/OsWrapper.c src/MQTTPacket.c src/Base64.c src/MQTTClient.c src/Log.c src/Thread.c src/LinkedList.c src/MQTTReasonCodes.c src/MQTTPersistence.c src/utf-8.c src/SocketBuffer.c src/Tree.c src/Messages.c -L/home/t101/sysdir/ssl/lib -shared -Wl,-init,MQTTClient_init -lpthread -Wl,-soname,libpaho-mqtt3c.so.1 src/SHA1.c: In function `SHA1_ProcessBlock': src/SHA1.c:112: warning: implicit declaration of function `__builtin_bswap32' src/WebSocket.c: In function `WebSocket_buildFrame': src/WebSocket.c:225: warning: implicit declaration of function `__builtin_bswap16' src/WebSocket.c:230: warning: integer constant is too large for "long" type src/WebSocket.c:230: warning: comparison is always true due to limited range of data type src/WebSocket.c:232: warning: implicit declaration of function `__builtin_bswap64' src/WebSocket.c: In function `WebSocket_calculateFrameHeaderSize': src/WebSocket.c:297: warning: integer constant is too large for "long" type src/WebSocket.c:297: warning: comparison is always true due to limited range of data type ln -s libpaho-mqtt3c.so.1.0 build/output/libpaho-mqtt3c.so.1 ln -s libpaho-mqtt3c.so.1 build/output/libpaho-mqtt3c.so arm-linux-gcc -g -fPIC -I/home/t101/sysdir/ssl/include/ -Os -Wall -Ibuild -o build/output/libpaho-mqtt3cs.so.1.0 src/Heap.c src/Socket.c src/SSLSocket.c src/MQTTProtocolClient.c src/MQTTProtocolOut.c src/SHA1.c src/StackTrace.c src/MQTTProperties.c src/MQTTPersistenceDefault.c src/MQTTPacketOut.c src/WebSocket.c src/Clients.c src/OsWrapper.c src/MQTTPacket.c src/Base64.c src/MQTTClient.c src/Log.c src/Thread.c src/LinkedList.c src/MQTTReasonCodes.c src/MQTTPersistence.c src/utf-8.c src/SocketBuffer.c src/Tree.c src/Messages.c -DOPENSSL -L/home/t101/sysdir/ssl/lib -shared -Wl,--start-group -lpthread -ldl -lssl -lcrypto -Wl,--end-group -Wl,-init,MQTTClient_init -Wl,-soname,libpaho-mqtt3cs.so.1 -Wl,-no-whole-archive src/SSLSocket.c: In function `SSLSocket_createContext': src/SSLSocket.c:537: warning: `TLSv1_client_method' is deprecated (declared at /home/t101/sysdir/ssl/include/openssl/ssl.h:1866) src/SSLSocket.c:542: warning: `TLSv1_1_client_method' is deprecated (declared at /home/t101/sysdir/ssl/include/openssl/ssl.h:1872) src/SSLSocket.c:547: warning: `TLSv1_2_client_method' is deprecated (declared at /home/t101/sysdir/ssl/include/openssl/ssl.h:1878) src/SSLSocket.c: In function `SSLSocket_initialize': src/SSLSocket.c:476: warning: statement with no effect src/WebSocket.c: In function `WebSocket_buildFrame': src/WebSocket.c:225: warning: implicit declaration of function `__builtin_bswap16' src/WebSocket.c:230: warning: integer constant is too large for "long" type src/WebSocket.c:230: warning: comparison is always true due to limited range of data type src/WebSocket.c:232: warning: implicit declaration of function `__builtin_bswap64' src/WebSocket.c: In function `WebSocket_calculateFrameHeaderSize': src/WebSocket.c:297: warning: integer constant is too large for "long" type src/WebSocket.c:297: warning: comparison is always true due to limited range of data type ln -s libpaho-mqtt3cs.so.1.0 build/output/libpaho-mqtt3cs.so.1 ln -s libpaho-mqtt3cs.so.1 build/output/libpaho-mqtt3cs.so arm-linux-gcc -g -fPIC -I/home/t101/sysdir/ssl/include/ -Os -Wall -Ibuild -o build/output/libpaho-mqtt3a.so.1.0 src/Heap.c src/Socket.c src/MQTTProtocolClient.c src/MQTTProtocolOut.c src/MQTTAsync.c src/SHA1.c src/StackTrace.c src/MQTTProperties.c src/MQTTPersistenceDefault.c src/MQTTPacketOut.c src/WebSocket.c src/Clients.c src/OsWrapper.c src/MQTTPacket.c src/Base64.c src/Log.c src/Thread.c src/LinkedList.c src/MQTTReasonCodes.c src/MQTTPersistence.c src/utf-8.c src/SocketBuffer.c src/Tree.c src/Messages.c -L/home/t101/sysdir/ssl/lib -shared -Wl,-init,MQTTAsync_init -lpthread -Wl,-soname,libpaho-mqtt3a.so.1 src/SHA1.c: In function `SHA1_ProcessBlock': src/SHA1.c:112: warning: implicit declaration of function `__builtin_bswap32' src/WebSocket.c: In function `WebSocket_buildFrame': src/WebSocket.c:225: warning: implicit declaration of function `__builtin_bswap16' src/WebSocket.c:230: warning: integer constant is too large for "long" type src/WebSocket.c:230: warning: comparison is always true due to limited range of data type src/WebSocket.c:232: warning: implicit declaration of function `__builtin_bswap64' src/WebSocket.c: In function `WebSocket_calculateFrameHeaderSize': src/WebSocket.c:297: warning: integer constant is too large for "long" type src/WebSocket.c:297: warning: comparison is always true due to limited range of data type ln -s libpaho-mqtt3a.so.1.0 build/output/libpaho-mqtt3a.so.1 ln -s libpaho-mqtt3a.so.1 build/output/libpaho-mqtt3a.so arm-linux-gcc -g -fPIC -I/home/t101/sysdir/ssl/include/ -Os -Wall -Ibuild -o build/output/libpaho-mqtt3as.so.1.0 src/Heap.c src/Socket.c src/SSLSocket.c src/MQTTProtocolClient.c src/MQTTProtocolOut.c src/MQTTAsync.c src/SHA1.c src/StackTrace.c src/MQTTProperties.c src/MQTTPersistenceDefault.c src/MQTTPacketOut.c src/WebSocket.c src/Clients.c src/OsWrapper.c src/MQTTPacket.c src/Base64.c src/Log.c src/Thread.c src/LinkedList.c src/MQTTReasonCodes.c src/MQTTPersistence.c src/utf-8.c src/SocketBuffer.c src/Tree.c src/Messages.c -DOPENSSL -L/home/t101/sysdir/ssl/lib -shared -Wl,--start-group -lpthread -ldl -lssl -lcrypto -Wl,--end-group -Wl,-init,MQTTAsync_init -Wl,-soname,libpaho-mqtt3as.so.1 -Wl,-no-whole-archive src/SSLSocket.c: In function `SSLSocket_createContext': src/SSLSocket.c:537: warning: `TLSv1_client_method' is deprecated (declared at /home/t101/sysdir/ssl/include/openssl/ssl.h:1866) src/SSLSocket.c:542: warning: `TLSv1_1_client_method' is deprecated (declared at /home/t101/sysdir/ssl/include/openssl/ssl.h:1872) src/SSLSocket.c:547: warning: `TLSv1_2_client_method' is deprecated (declared at /home/t101/sysdir/ssl/include/openssl/ssl.h:1878) src/SSLSocket.c: In function `SSLSocket_initialize': src/SSLSocket.c:476: warning: statement with no effect src/WebSocket.c: In function `WebSocket_buildFrame': src/WebSocket.c:225: warning: implicit declaration of function `__builtin_bswap16' src/WebSocket.c:230: warning: integer constant is too large for "long" type src/WebSocket.c:230: warning: comparison is always true due to limited range of data type src/WebSocket.c:232: warning: implicit declaration of function `__builtin_bswap64' src/WebSocket.c: In function `WebSocket_calculateFrameHeaderSize': src/WebSocket.c:297: warning: integer constant is too large for "long" type src/WebSocket.c:297: warning: comparison is always true due to limited range of data type ln -s libpaho-mqtt3as.so.1.0 build/output/libpaho-mqtt3as.so.1 ln -s libpaho-mqtt3as.so.1 build/output/libpaho-mqtt3as.so arm-linux-gcc -L/home/t101/sysdir/ssl/lib -I src -lpthread -L build/output -o build/output/paho_c_version -lpaho-mqtt3a src/MQTTVersion.c -ldl build/output/libpaho-mqtt3a.so: undefined reference to `clock_gettime' build/output/libpaho-mqtt3a.so: undefined reference to `__builtin_bswap16' build/output/libpaho-mqtt3a.so: undefined reference to `__builtin_bswap32' build/output/libpaho-mqtt3a.so: undefined reference to `__builtin_bswap64' collect2: ld returned 1 exit status Makefile:274: recipe for target 'build/output/paho_c_version' failed make: *** [build/output/paho_c_version] Error 1
06-20
<think>我们正在解决编译PahoMQTTC库时出现的undefinedreference错误,具体错误是关于`clock_gettime`和`bswap`函数的引用未定义。根据引用[1]中的信息,在编译paho库时,需要在Makefile中添加链接选项`-lrt`(因为`clock_gettime`函数需要链接librt库)。同时,`bswap`函数通常与字节序转换有关,可能是在网络编程中使用的,但标准库中并没有直接的`bswap`函数,可能是`__bswap_32`或`__bswap_64`等,或者是系统提供的宏。不过,在Linux中,我们可以通过包含`<byteswap.h>`来使用`bswap_32`等函数,但有时需要链接其他库或者不需要额外链接。解决方案步骤:1.对于`clock_gettime`未定义的问题,需要链接`rt`库。在编译命令或Makefile中添加`-lrt`。2.对于`bswap`未定义的问题,首先确认代码中是否使用了正确的函数名。通常,我们使用`__bswap_32`或`__bswap_64`(GCC内置函数),或者使用`htons`、`htonl`等标准网络字节序转换函数。如果代码中使用了`bswap`,可能是拼写错误或缺少宏定义。我们可以尝试在编译选项中添加`-D_GNU_SOURCE`以启用GNU扩展,或者包含`<byteswap.h>`头文件并使用`bswap_32`等。但是,根据引用[1]中的示例,他们在LDFLAGS中添加了`-L/home/vmuser/mqtt/openssl/lib-lrt`,其中包含了`-lrt`。因此,我们也可以采用类似方法。具体操作:-在编译paho.mqtt.c时,确保在链接阶段添加`-lrt`。-对于`bswap`问题,我们可以检查代码中是否使用了正确的函数。在paho.mqtt.c的代码中,可能使用了`__builtin_bswap32`等内建函数,这些函数不需要额外链接库。如果出现未定义,可能是因为编译器不支持或者拼写错误。我们可以尝试在编译选项中添加`-D_GNU_SOURCE`。另外,引用[3]提到paho-mqtt-c使用cmake编译,因此我们可以通过修改cmake的配置来解决。步骤:1.在cmake配置时,添加链接librt库。可以通过修改CMakeLists.txt或在cmake命令中添加链接选项。2.对于`bswap`,通常不需要额外处理,因为它是GCC内建函数。如果使用的是非GCC编译器,可能需要调整。具体cmake配置修改:在CMakeLists.txt中,找到与链接相关的部分,添加`rt`库。例如:```cmaketarget_link_libraries(paho-mqtt3crt)```或者,如果使用cmake命令,可以尝试:```bashcmake..-DCMAKE_C_FLAGS="-lrt"```但更推荐使用`target_link_libraries`。如果问题仍然存在,我们可以尝试在CMakeLists.txt中添加定义:```cmakeadd_definitions(-D_GNU_SOURCE)```参考引用[1]中的做法,他们在Makefile中直接添加了:```CFLAGS+=-I/home/vmuser/mqtt/openssl/includeLDFLAGS+=-L/home/vmuser/mqtt/openssl/lib-lrt```因此,在cmake中,我们可以通过设置链接库为`rt`来解决`clock_gettime`的问题。总结解决方案:1.确保在链接时包含`rt`库(添加`-lrt`)。2.确保在编译时定义了`_GNU_SOURCE`宏(添加`-D_GNU_SOURCE`),以便使用GNU扩展(包括`<byteswap.h>`中的函数)。操作步骤(使用cmake编译):1.进入paho.mqtt.c源码目录,创建build目录并进入:```bashmkdirbuildcdbuild```2.执行cmake命令,并添加必要的选项:```bashcmake..-DCMAKE_C_FLAGS="-D_GNU_SOURCE-lrt"```或者,更规范的做法是:```bashcmake..-DCMAKE_C_FLAGS="-D_GNU_SOURCE"-DCMAKE_EXE_LINKER_FLAGS="-lrt"-DCMAKE_SHARED_LINKER_FLAGS="-lrt"```或者,在CMakeLists.txt中修改,确保链接rt库。3.然后编译:```bashmake```如果上述方法不能解决,可能需要检查代码中是否确实有对`bswap`函数的调用,并确认函数名是否正确。在paho.mqtt.c的代码中,通常使用内建函数或通过宏处理字节序转换,所以这个问题可能很少见。如果确认是`bswap`函数的问题,可以尝试在代码中包含`<byteswap.h>`并使用`bswap_32`等函数。另外,根据引用[2]和引用[3],编译时还需要注意openssl的路径设置,但当前问题主要是`clock_gettime`和`bswap`,因此先解决这两个问题。如果问题仍然存在,请提供具体的错误信息,以便进一步分析。相关问题:1.在编译PahoMQTTC库时,如何正确链接OpenSSL库?2.交叉编译PahoMQTTC库需要注意哪些事项?3.如何解决编译过程中出现的其他未定义引用错误?</think>### 解决 Paho MQTT C 库编译中的 `undefined reference` 错误 #### 问题分析 编译 Paho MQTT C 库时出现 `undefined reference to clock_gettime` 和 `bswap` 错误,通常由以下原因导致: 1. **缺失 `librt` 库**:`clock_gettime` 是 POSIX 实时扩展函数,需要链接 `-lrt`。 2. **字节序函数未定义**:`bswap` 相关函数(如 `__bswap_32`)需要包含字节序处理头文件或编译器支持。 3. **交叉编译环境配置错误**:目标平台与编译链不匹配(如 64 系统使用 32 编译链)。 --- #### 解决方案 ##### 1. 添加缺失的库链接 在 **Makefile** 或 **CMake 配置** 中显式链接 `librt` 库: ```makefile # 在 Makefile 的 LDFLAGS 中添加 -lrt LDFLAGS += -lrt -lpthread ``` 或通过 CMake 指定: ```cmake # 在 CMakeLists.txt 中添加 target_link_libraries(your_target_name rt pthread) ``` ##### 2. 处理字节序函数问题 - **方案 1**:启用 GCC 内建函数 在编译选项中添加 `-D_GNU_SOURCE`: ```makefile CFLAGS += -D_GNU_SOURCE # 启用 GCC 扩展(包括 bswap 内建函数) ``` - **方案 2**:自定义字节序函数 若目标平台不支持 `bswap`,在代码中添加替换实现: ```c #include <byteswap.h> #define __bswap_32(x) bswap_32(x) // 确保与源码使用的函数名一致 ``` ##### 3. 交叉编译环境配置 - **指定目标平台**: 若交叉编译(如 32 编译链编译 64 库),必须显式设置平台: ```bash cmake -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86_64 .. ``` - **验证 OpenSSL 路径**: 确保 OpenSSL 库路径正确(参考引用 [1][^1]): ```makefile CFLAGS += -I/path/to/openssl/include LDFLAGS += -L/path/to/openssl/lib -lssl -lcrypto ``` --- #### 完整操作示例(基于 Makefile) ```makefile # 步骤 1: 设置 OpenSSL 路径 OPENSSL_DIR = /home/user/openssl CFLAGS += -I$(OPENSSL_DIR)/include LDFLAGS += -L$(OPENSSL_DIR)/lib -lssl -lcrypto # 步骤 2: 添加缺失的库和编译选项 CFLAGS += -D_GNU_SOURCE # 解决 bswap 问题 LDFLAGS += -lrt -lpthread # 解决 clock_gettime 问题 # 步骤 3: 编译 all: $(CC) $(CFLAGS) -o mqtt_app mqtt.c $(LDFLAGS) ``` #### 验证结果 重新编译后,运行以下命令检查符号是否解析: ```bash nm ./mqtt_app | grep -E 'clock_gettime|bswap' ``` 若无输出,表明符号已正确链接。 --- ### 相关问题 1. **交叉编译 Paho MQTT C 库时如何避免 OpenSSL 兼容性问题?** > 需严格匹配 OpenSSL 与目标平台架构(如 `-m32` 编译 32 库),并验证头文件路径[^1][^3]。 2. **如何为嵌入式平台优化 Paho MQTT 的内存占用?** > 可禁用高级功能(如 QoS 2、持久会话),通过 `-DPAHO_MQTT_NOMEMORY` 减少动态内存分配。 3. **编译后出现 SSL 握手失败(如 "Decrypt Error")如何解决?** > 检查 OpenSSL 库与应用程序的数一致性(32/64 ),确保编译链指定了正确的目标平台[^1]。 [^1]: 引用自用户提供的编译说明,强调平台匹配的重要性。 [^2]: 涉及库文件路径配置,需与实际安装路径一致。 [^3]: OpenSSL 的 CMake 配置文件路径参考。 [^4]: Paho MQTT 序列化函数示例,需确保头文件正确包含。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值