我正在编写c ++程序,我想在Mac OS X 10.6及更高版本上发布它.问题是当我使用clang编译程序并且它与libstdc ++动态链接时,它会导致旧系统出现问题.
-static-stdc++gcc中有一个键但是clang中没有人.如何将我的程序与clang静态链接?
我的主要目标是在Mac OS X 10.9上编译二进制文件,并能够在早期版本上运行它.也许有不同的方式?
谢谢.
我有一个可执行文件和一个动态库(.so).该库成功导出一些符号和可执行调用.但我希望库调用可执行文件的功能.我试过在可执行文件中做以下操作:
//test
extern "C" void print(const char * str) {
std::cout << str << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这在图书馆:
extern "C" void print(const char *);
Run Code Online (Sandbox Code Playgroud)
但是当我调用dlopen可执行文件(加载库)时,它返回错误undefined symbol: print.我该怎么办呢?
我需要在线程中更改区域设置以正确解析带有strtod()的double,我正在使用setlocale()(C++).它是线程安全的吗?
更新:另一个问题.当我在main()函数中调用setlocale()时,它不会更深入地影响其他例程.为什么???有很多代码,所以编写块有问题.
我需要在C++中使用gsoap库,我需要使用https.文档说明了如何在C中使用HTTPS,但在C++中却没有(http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.20).特别是,我在soap_ssl_init();功能上有编译错误.我查了/ usr/lib/libgsoap*文件,找到了ligsoapssl ++.一个文件并链接到它.这个错误消失了,但我明白了error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed.这意味着我需要调用soap_ssl_client_contextfunc,但是在C++中没有生成类.我该怎么办?
UPD:我自己解决了这个问题.但它是古怪的,非常古怪的方式.gSOAP生成继承自struct soap的C++类,它包含以下attrs:
BIO *bio;
SSL *ssl;
SSL_CTX *ctx;
unsigned short ssl_flags;
const char *keyfile;
const char *password;
const char *dhfile;
const char *cafile;
const char *capath;
const char *crlfile;
const char *randfile;
SSL_SESSION *session;
Run Code Online (Sandbox Code Playgroud)
所以我们可以自己在OpenSSL库中设置必要的attrs(flags,params).在简单的情况下,它足以调用soap_ssl_init()一次并设置ssl_flags = SOAP_SSL_NO_AUTHENTICATION.这个对我有用.如果有人知道更好的方式,我会很高兴看到.
我用过搜索但是我找不到满足我的答案...所以......这是一大堆代码:
//VoteContainer.h
typedef uint32_t order_id_t;
typedef int driver_id_t;
class Vote {
public:
enum DriverVoteResponse {YES, NO, TIMEOUT};
struct DriverResponse {
driver_id_t driver_id;
time_t time;
DriverVoteResponse response;
};
Vote() : m_order_id(0), m_time_until(0) {};
Vote(order_id_t inOrderId, std::vector<driver_id_t> inPermittedDrivers, int inSeconds);
Vote(const Vote & other) : m_order_id(other.m_order_id), m_time_until(other.m_order_id) {
m_drivers_responses = other.m_drivers_responses;
m_permitted_drivers = other.m_permitted_drivers;
};
virtual ~Vote() {};
virtual void addDriverVote(driver_id_t inDriverId, DriverVoteResponse inDriverResponse);
virtual void getAppropriateDriverId(driver_id_t * inDriverId); //with min response time
private:
order_id_t m_order_id;
time_t m_time_until;
std::vector<DriverResponse> m_drivers_responses;
std::vector<driver_id_t> m_permitted_drivers; …Run Code Online (Sandbox Code Playgroud) 我必须分析我的多线程 C++ 应用程序并找到它的瓶颈。问题是:我需要查看挂钟配置文件。我用过oprofile和perf。没有人可以向我提供这样的信息。
我使用过perf record -g -e sched:sched_stat_sleep <cmd>但因perf recordSIGFPE 异常而失败。这让我很生气。
Valgrind不适合我,因为我使用fanotify_mark了此工具中未实现的 syscall。
我不确定谷歌是否perftools可以进行挂钟分析 - 我在他们的文档中没有看到任何信息。
任何人都可以建议吗?谢谢你。
我有以下问题:这是代码块:
void get_all_buf(int sock, std::string & inStr) {
int n = 1;
char c;
char temp[1024*1024];
bzero(temp, sizeof(temp));
n = recv(sock, temp, sizeof(temp), 0);
inStr = temp;
};
Run Code Online (Sandbox Code Playgroud)
但有时recv返回不是整个数据(数据长度总是少于sizeof(temp)),只有它的一部分.写方面总是向我发送整个数据(我用嗅探器得到它).什么事?谢谢.
PS我知道,好的方式建议我检查n(if (n < 0) perror ("error while receiving data")),但现在没关系 - 这不是我的问题的原因.
PS2我忘记了 - 这是阻塞插座.
我正在尝试编写std::map密钥有2个值的容器.这是一个例子:
#include <map>
#include <iostream>
using namespace std;
struct Key {
int i1;
int i2;
struct Comparator {
bool operator() (const Key& k1, const Key& k2) {
if (k1.i1 < k2.i1)
return true;
else if (k1.i2 < k2.i2)
return true;
return false;
}
};
};
int main() {
std::map<Key, int, Key::Comparator> tree;
for (int i = 0; i < 100; ++i) {
for (int j = 0; j < 10; ++j) {
Key key = {i, j};
tree[key] …Run Code Online (Sandbox Code Playgroud) 我有一个以下问题:我有一个接收连接的epoll代码:
while (1) {
int nfds = epoll_wait(epollfd, events, 4096, -1);
if (nfds == -1) {
if (errno == EINTR)
continue;
perror("epoll_wait");
exit(EXIT_FAILURE);
}
for (int i = 0; i < nfds; i++) {
if (events[i].data.fd == server_sock) {
client_sock = accept(server_sock,
(struct sockaddr *)&client_name,
(socklen_t *)(&client_name_len));
if (client_sock == -1) //server overloaded
continue;
ev.events = EPOLLIN | EPOLLERR;
#ifdef CORE_NONBLOCKING_SOCKETS
Arch::set_nonblocking(client_sock);
ev.events |= EPOLLET; //input data and connection closing
#endif
#ifdef EPOLLRDHUP
ev.events |= EPOLLRDHUP ;//
#else
//for old …Run Code Online (Sandbox Code Playgroud) 我可以使用curl的功能来接收客户端https连接吗?我想使用libcurl编写服务器,我应该使用裸套接字来接受连接吗?官方文档提供以下示例:
/* read the response */
for(;;)
{
char buf[1024];
wait_on_socket(sockfd, 1, 60000L);
res = curl_easy_recv(curl, buf, 1024, &iolen);
if(CURLE_OK != res)
break;
printf("Received %u bytes.\n", iolen);
}
Run Code Online (Sandbox Code Playgroud)
但他们总是写客户,而不是服务器......