如何在Linux中为可执行文件提供图标,在Windows中我们可以使用windres,但是Linux中的等效项是什么?
OS : Linux Mint
Text Editor : VScode
Building way : Makefile
The code down below as nothing special, it is just for test purpose.
CC = g++
CFLAGS = -std=c++23 -D_GNU_SOURCE
PROJECT: main.o
$(CC) $(CFLAGS) $^ -o $@
main.o: main.cpp
$(CC) $(CFLAGS) -c $^ -o $@
#include <iostream>
int main(){
std::cout << "1234" << std::endl;
return 0;
}
正如OP尝试的那样
asprintf()
,也许像:
char *ptr = NULL;
asprintf(&ptr, "%d", some_int);
char ptr[INT_STRING_SIZE];
sprintf(ptr, "%d", some_int);
要将其用作函数调用中的单行代码,请形成一个辅助函数和宏:
#include <assert.h>
#include <limits.h>
#include <stdio.h>
#define LOG10_2_N 28
#define LOG10_2_D 93
#define INT_STRING_SIZE ((sizeof(int)*CHAR_BIT - 1)*LOG10_2_N/LOG10_2_D + 3)
char* my_itoa(char buf[INT_STRING_SIZE], int i) {
int len = snprintf(buf, INT_STRING_SIZE, "%d", i);
assert(len > 0 && (unsigned) len < INT_STRING_SIZE);
return buf;
}
#define MY_ITOA(i) my_itoa((char [INT_STRING_SIZE]){""}, (i))
并用作
int main() {
void myFunction(char *);
myFunction(MY_ITOA(1000));
myFunction(MY_ITOA(-1000));
myFunction(MY_ITOA(42));
void myFunction2(char *a, char *b);
myFunction2(MY_ITOA(1000), MY_ITOA(2000));
}
这适用于 C99 标准及更高版本。它使用
(char [INT_STRING_SIZE]){""}
,一个复合文字。提供的字符串在代码块结束之前有效。不需要 free()
之类的代码。
如果您允许使用 GNU C 扩展,您可以使用 表达式中的语句和声明:
foo( ({ char buf[32]; snprintf(buf, sizeof buf, "%i", 1000); strdup(buf); }) );
或使用
asprintf()
:
foo( ({ char *p; asprintf(&p, "%i", 1000); p; }) );
您必须稍后分配字符串以避免内存泄漏。